xref: /aosp_15_r20/external/clang/lib/Sema/TreeTransform.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //===----------------------------------------------------------------------===//
8*67e74705SXin Li //
9*67e74705SXin Li //  This file implements a semantic tree transformation that takes a given
10*67e74705SXin Li //  AST and rebuilds it, possibly transforming some nodes in the process.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15*67e74705SXin Li #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
16*67e74705SXin Li 
17*67e74705SXin Li #include "TypeLocBuilder.h"
18*67e74705SXin Li #include "clang/AST/Decl.h"
19*67e74705SXin Li #include "clang/AST/DeclObjC.h"
20*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
21*67e74705SXin Li #include "clang/AST/Expr.h"
22*67e74705SXin Li #include "clang/AST/ExprCXX.h"
23*67e74705SXin Li #include "clang/AST/ExprObjC.h"
24*67e74705SXin Li #include "clang/AST/ExprOpenMP.h"
25*67e74705SXin Li #include "clang/AST/Stmt.h"
26*67e74705SXin Li #include "clang/AST/StmtCXX.h"
27*67e74705SXin Li #include "clang/AST/StmtObjC.h"
28*67e74705SXin Li #include "clang/AST/StmtOpenMP.h"
29*67e74705SXin Li #include "clang/Sema/Designator.h"
30*67e74705SXin Li #include "clang/Sema/Lookup.h"
31*67e74705SXin Li #include "clang/Sema/Ownership.h"
32*67e74705SXin Li #include "clang/Sema/ParsedTemplate.h"
33*67e74705SXin Li #include "clang/Sema/ScopeInfo.h"
34*67e74705SXin Li #include "clang/Sema/SemaDiagnostic.h"
35*67e74705SXin Li #include "clang/Sema/SemaInternal.h"
36*67e74705SXin Li #include "llvm/ADT/ArrayRef.h"
37*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
38*67e74705SXin Li #include <algorithm>
39*67e74705SXin Li 
40*67e74705SXin Li namespace clang {
41*67e74705SXin Li using namespace sema;
42*67e74705SXin Li 
43*67e74705SXin Li /// \brief A semantic tree transformation that allows one to transform one
44*67e74705SXin Li /// abstract syntax tree into another.
45*67e74705SXin Li ///
46*67e74705SXin Li /// A new tree transformation is defined by creating a new subclass \c X of
47*67e74705SXin Li /// \c TreeTransform<X> and then overriding certain operations to provide
48*67e74705SXin Li /// behavior specific to that transformation. For example, template
49*67e74705SXin Li /// instantiation is implemented as a tree transformation where the
50*67e74705SXin Li /// transformation of TemplateTypeParmType nodes involves substituting the
51*67e74705SXin Li /// template arguments for their corresponding template parameters; a similar
52*67e74705SXin Li /// transformation is performed for non-type template parameters and
53*67e74705SXin Li /// template template parameters.
54*67e74705SXin Li ///
55*67e74705SXin Li /// This tree-transformation template uses static polymorphism to allow
56*67e74705SXin Li /// subclasses to customize any of its operations. Thus, a subclass can
57*67e74705SXin Li /// override any of the transformation or rebuild operators by providing an
58*67e74705SXin Li /// operation with the same signature as the default implementation. The
59*67e74705SXin Li /// overridding function should not be virtual.
60*67e74705SXin Li ///
61*67e74705SXin Li /// Semantic tree transformations are split into two stages, either of which
62*67e74705SXin Li /// can be replaced by a subclass. The "transform" step transforms an AST node
63*67e74705SXin Li /// or the parts of an AST node using the various transformation functions,
64*67e74705SXin Li /// then passes the pieces on to the "rebuild" step, which constructs a new AST
65*67e74705SXin Li /// node of the appropriate kind from the pieces. The default transformation
66*67e74705SXin Li /// routines recursively transform the operands to composite AST nodes (e.g.,
67*67e74705SXin Li /// the pointee type of a PointerType node) and, if any of those operand nodes
68*67e74705SXin Li /// were changed by the transformation, invokes the rebuild operation to create
69*67e74705SXin Li /// a new AST node.
70*67e74705SXin Li ///
71*67e74705SXin Li /// Subclasses can customize the transformation at various levels. The
72*67e74705SXin Li /// most coarse-grained transformations involve replacing TransformType(),
73*67e74705SXin Li /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
74*67e74705SXin Li /// TransformTemplateName(), or TransformTemplateArgument() with entirely
75*67e74705SXin Li /// new implementations.
76*67e74705SXin Li ///
77*67e74705SXin Li /// For more fine-grained transformations, subclasses can replace any of the
78*67e74705SXin Li /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
79*67e74705SXin Li /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
80*67e74705SXin Li /// replacing TransformTemplateTypeParmType() allows template instantiation
81*67e74705SXin Li /// to substitute template arguments for their corresponding template
82*67e74705SXin Li /// parameters. Additionally, subclasses can override the \c RebuildXXX
83*67e74705SXin Li /// functions to control how AST nodes are rebuilt when their operands change.
84*67e74705SXin Li /// By default, \c TreeTransform will invoke semantic analysis to rebuild
85*67e74705SXin Li /// AST nodes. However, certain other tree transformations (e.g, cloning) may
86*67e74705SXin Li /// be able to use more efficient rebuild steps.
87*67e74705SXin Li ///
88*67e74705SXin Li /// There are a handful of other functions that can be overridden, allowing one
89*67e74705SXin Li /// to avoid traversing nodes that don't need any transformation
90*67e74705SXin Li /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
91*67e74705SXin Li /// operands have not changed (\c AlwaysRebuild()), and customize the
92*67e74705SXin Li /// default locations and entity names used for type-checking
93*67e74705SXin Li /// (\c getBaseLocation(), \c getBaseEntity()).
94*67e74705SXin Li template<typename Derived>
95*67e74705SXin Li class TreeTransform {
96*67e74705SXin Li   /// \brief Private RAII object that helps us forget and then re-remember
97*67e74705SXin Li   /// the template argument corresponding to a partially-substituted parameter
98*67e74705SXin Li   /// pack.
99*67e74705SXin Li   class ForgetPartiallySubstitutedPackRAII {
100*67e74705SXin Li     Derived &Self;
101*67e74705SXin Li     TemplateArgument Old;
102*67e74705SXin Li 
103*67e74705SXin Li   public:
ForgetPartiallySubstitutedPackRAII(Derived & Self)104*67e74705SXin Li     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
105*67e74705SXin Li       Old = Self.ForgetPartiallySubstitutedPack();
106*67e74705SXin Li     }
107*67e74705SXin Li 
~ForgetPartiallySubstitutedPackRAII()108*67e74705SXin Li     ~ForgetPartiallySubstitutedPackRAII() {
109*67e74705SXin Li       Self.RememberPartiallySubstitutedPack(Old);
110*67e74705SXin Li     }
111*67e74705SXin Li   };
112*67e74705SXin Li 
113*67e74705SXin Li protected:
114*67e74705SXin Li   Sema &SemaRef;
115*67e74705SXin Li 
116*67e74705SXin Li   /// \brief The set of local declarations that have been transformed, for
117*67e74705SXin Li   /// cases where we are forced to build new declarations within the transformer
118*67e74705SXin Li   /// rather than in the subclass (e.g., lambda closure types).
119*67e74705SXin Li   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
120*67e74705SXin Li 
121*67e74705SXin Li public:
122*67e74705SXin Li   /// \brief Initializes a new tree transformer.
TreeTransform(Sema & SemaRef)123*67e74705SXin Li   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
124*67e74705SXin Li 
125*67e74705SXin Li   /// \brief Retrieves a reference to the derived class.
getDerived()126*67e74705SXin Li   Derived &getDerived() { return static_cast<Derived&>(*this); }
127*67e74705SXin Li 
128*67e74705SXin Li   /// \brief Retrieves a reference to the derived class.
getDerived()129*67e74705SXin Li   const Derived &getDerived() const {
130*67e74705SXin Li     return static_cast<const Derived&>(*this);
131*67e74705SXin Li   }
132*67e74705SXin Li 
Owned(Expr * E)133*67e74705SXin Li   static inline ExprResult Owned(Expr *E) { return E; }
Owned(Stmt * S)134*67e74705SXin Li   static inline StmtResult Owned(Stmt *S) { return S; }
135*67e74705SXin Li 
136*67e74705SXin Li   /// \brief Retrieves a reference to the semantic analysis object used for
137*67e74705SXin Li   /// this tree transform.
getSema()138*67e74705SXin Li   Sema &getSema() const { return SemaRef; }
139*67e74705SXin Li 
140*67e74705SXin Li   /// \brief Whether the transformation should always rebuild AST nodes, even
141*67e74705SXin Li   /// if none of the children have changed.
142*67e74705SXin Li   ///
143*67e74705SXin Li   /// Subclasses may override this function to specify when the transformation
144*67e74705SXin Li   /// should rebuild all AST nodes.
145*67e74705SXin Li   ///
146*67e74705SXin Li   /// We must always rebuild all AST nodes when performing variadic template
147*67e74705SXin Li   /// pack expansion, in order to avoid violating the AST invariant that each
148*67e74705SXin Li   /// statement node appears at most once in its containing declaration.
AlwaysRebuild()149*67e74705SXin Li   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
150*67e74705SXin Li 
151*67e74705SXin Li   /// \brief Returns the location of the entity being transformed, if that
152*67e74705SXin Li   /// information was not available elsewhere in the AST.
153*67e74705SXin Li   ///
154*67e74705SXin Li   /// By default, returns no source-location information. Subclasses can
155*67e74705SXin Li   /// provide an alternative implementation that provides better location
156*67e74705SXin Li   /// information.
getBaseLocation()157*67e74705SXin Li   SourceLocation getBaseLocation() { return SourceLocation(); }
158*67e74705SXin Li 
159*67e74705SXin Li   /// \brief Returns the name of the entity being transformed, if that
160*67e74705SXin Li   /// information was not available elsewhere in the AST.
161*67e74705SXin Li   ///
162*67e74705SXin Li   /// By default, returns an empty name. Subclasses can provide an alternative
163*67e74705SXin Li   /// implementation with a more precise name.
getBaseEntity()164*67e74705SXin Li   DeclarationName getBaseEntity() { return DeclarationName(); }
165*67e74705SXin Li 
166*67e74705SXin Li   /// \brief Sets the "base" location and entity when that
167*67e74705SXin Li   /// information is known based on another transformation.
168*67e74705SXin Li   ///
169*67e74705SXin Li   /// By default, the source location and entity are ignored. Subclasses can
170*67e74705SXin Li   /// override this function to provide a customized implementation.
setBase(SourceLocation Loc,DeclarationName Entity)171*67e74705SXin Li   void setBase(SourceLocation Loc, DeclarationName Entity) { }
172*67e74705SXin Li 
173*67e74705SXin Li   /// \brief RAII object that temporarily sets the base location and entity
174*67e74705SXin Li   /// used for reporting diagnostics in types.
175*67e74705SXin Li   class TemporaryBase {
176*67e74705SXin Li     TreeTransform &Self;
177*67e74705SXin Li     SourceLocation OldLocation;
178*67e74705SXin Li     DeclarationName OldEntity;
179*67e74705SXin Li 
180*67e74705SXin Li   public:
TemporaryBase(TreeTransform & Self,SourceLocation Location,DeclarationName Entity)181*67e74705SXin Li     TemporaryBase(TreeTransform &Self, SourceLocation Location,
182*67e74705SXin Li                   DeclarationName Entity) : Self(Self) {
183*67e74705SXin Li       OldLocation = Self.getDerived().getBaseLocation();
184*67e74705SXin Li       OldEntity = Self.getDerived().getBaseEntity();
185*67e74705SXin Li 
186*67e74705SXin Li       if (Location.isValid())
187*67e74705SXin Li         Self.getDerived().setBase(Location, Entity);
188*67e74705SXin Li     }
189*67e74705SXin Li 
~TemporaryBase()190*67e74705SXin Li     ~TemporaryBase() {
191*67e74705SXin Li       Self.getDerived().setBase(OldLocation, OldEntity);
192*67e74705SXin Li     }
193*67e74705SXin Li   };
194*67e74705SXin Li 
195*67e74705SXin Li   /// \brief Determine whether the given type \p T has already been
196*67e74705SXin Li   /// transformed.
197*67e74705SXin Li   ///
198*67e74705SXin Li   /// Subclasses can provide an alternative implementation of this routine
199*67e74705SXin Li   /// to short-circuit evaluation when it is known that a given type will
200*67e74705SXin Li   /// not change. For example, template instantiation need not traverse
201*67e74705SXin Li   /// non-dependent types.
AlreadyTransformed(QualType T)202*67e74705SXin Li   bool AlreadyTransformed(QualType T) {
203*67e74705SXin Li     return T.isNull();
204*67e74705SXin Li   }
205*67e74705SXin Li 
206*67e74705SXin Li   /// \brief Determine whether the given call argument should be dropped, e.g.,
207*67e74705SXin Li   /// because it is a default argument.
208*67e74705SXin Li   ///
209*67e74705SXin Li   /// Subclasses can provide an alternative implementation of this routine to
210*67e74705SXin Li   /// determine which kinds of call arguments get dropped. By default,
211*67e74705SXin Li   /// CXXDefaultArgument nodes are dropped (prior to transformation).
DropCallArgument(Expr * E)212*67e74705SXin Li   bool DropCallArgument(Expr *E) {
213*67e74705SXin Li     return E->isDefaultArgument();
214*67e74705SXin Li   }
215*67e74705SXin Li 
216*67e74705SXin Li   /// \brief Determine whether we should expand a pack expansion with the
217*67e74705SXin Li   /// given set of parameter packs into separate arguments by repeatedly
218*67e74705SXin Li   /// transforming the pattern.
219*67e74705SXin Li   ///
220*67e74705SXin Li   /// By default, the transformer never tries to expand pack expansions.
221*67e74705SXin Li   /// Subclasses can override this routine to provide different behavior.
222*67e74705SXin Li   ///
223*67e74705SXin Li   /// \param EllipsisLoc The location of the ellipsis that identifies the
224*67e74705SXin Li   /// pack expansion.
225*67e74705SXin Li   ///
226*67e74705SXin Li   /// \param PatternRange The source range that covers the entire pattern of
227*67e74705SXin Li   /// the pack expansion.
228*67e74705SXin Li   ///
229*67e74705SXin Li   /// \param Unexpanded The set of unexpanded parameter packs within the
230*67e74705SXin Li   /// pattern.
231*67e74705SXin Li   ///
232*67e74705SXin Li   /// \param ShouldExpand Will be set to \c true if the transformer should
233*67e74705SXin Li   /// expand the corresponding pack expansions into separate arguments. When
234*67e74705SXin Li   /// set, \c NumExpansions must also be set.
235*67e74705SXin Li   ///
236*67e74705SXin Li   /// \param RetainExpansion Whether the caller should add an unexpanded
237*67e74705SXin Li   /// pack expansion after all of the expanded arguments. This is used
238*67e74705SXin Li   /// when extending explicitly-specified template argument packs per
239*67e74705SXin Li   /// C++0x [temp.arg.explicit]p9.
240*67e74705SXin Li   ///
241*67e74705SXin Li   /// \param NumExpansions The number of separate arguments that will be in
242*67e74705SXin Li   /// the expanded form of the corresponding pack expansion. This is both an
243*67e74705SXin Li   /// input and an output parameter, which can be set by the caller if the
244*67e74705SXin Li   /// number of expansions is known a priori (e.g., due to a prior substitution)
245*67e74705SXin Li   /// and will be set by the callee when the number of expansions is known.
246*67e74705SXin Li   /// The callee must set this value when \c ShouldExpand is \c true; it may
247*67e74705SXin Li   /// set this value in other cases.
248*67e74705SXin Li   ///
249*67e74705SXin Li   /// \returns true if an error occurred (e.g., because the parameter packs
250*67e74705SXin Li   /// are to be instantiated with arguments of different lengths), false
251*67e74705SXin Li   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
252*67e74705SXin Li   /// must be set.
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,ArrayRef<UnexpandedParameterPack> Unexpanded,bool & ShouldExpand,bool & RetainExpansion,Optional<unsigned> & NumExpansions)253*67e74705SXin Li   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
254*67e74705SXin Li                                SourceRange PatternRange,
255*67e74705SXin Li                                ArrayRef<UnexpandedParameterPack> Unexpanded,
256*67e74705SXin Li                                bool &ShouldExpand,
257*67e74705SXin Li                                bool &RetainExpansion,
258*67e74705SXin Li                                Optional<unsigned> &NumExpansions) {
259*67e74705SXin Li     ShouldExpand = false;
260*67e74705SXin Li     return false;
261*67e74705SXin Li   }
262*67e74705SXin Li 
263*67e74705SXin Li   /// \brief "Forget" about the partially-substituted pack template argument,
264*67e74705SXin Li   /// when performing an instantiation that must preserve the parameter pack
265*67e74705SXin Li   /// use.
266*67e74705SXin Li   ///
267*67e74705SXin Li   /// This routine is meant to be overridden by the template instantiator.
ForgetPartiallySubstitutedPack()268*67e74705SXin Li   TemplateArgument ForgetPartiallySubstitutedPack() {
269*67e74705SXin Li     return TemplateArgument();
270*67e74705SXin Li   }
271*67e74705SXin Li 
272*67e74705SXin Li   /// \brief "Remember" the partially-substituted pack template argument
273*67e74705SXin Li   /// after performing an instantiation that must preserve the parameter pack
274*67e74705SXin Li   /// use.
275*67e74705SXin Li   ///
276*67e74705SXin Li   /// This routine is meant to be overridden by the template instantiator.
RememberPartiallySubstitutedPack(TemplateArgument Arg)277*67e74705SXin Li   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
278*67e74705SXin Li 
279*67e74705SXin Li   /// \brief Note to the derived class when a function parameter pack is
280*67e74705SXin Li   /// being expanded.
ExpandingFunctionParameterPack(ParmVarDecl * Pack)281*67e74705SXin Li   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
282*67e74705SXin Li 
283*67e74705SXin Li   /// \brief Transforms the given type into another type.
284*67e74705SXin Li   ///
285*67e74705SXin Li   /// By default, this routine transforms a type by creating a
286*67e74705SXin Li   /// TypeSourceInfo for it and delegating to the appropriate
287*67e74705SXin Li   /// function.  This is expensive, but we don't mind, because
288*67e74705SXin Li   /// this method is deprecated anyway;  all users should be
289*67e74705SXin Li   /// switched to storing TypeSourceInfos.
290*67e74705SXin Li   ///
291*67e74705SXin Li   /// \returns the transformed type.
292*67e74705SXin Li   QualType TransformType(QualType T);
293*67e74705SXin Li 
294*67e74705SXin Li   /// \brief Transforms the given type-with-location into a new
295*67e74705SXin Li   /// type-with-location.
296*67e74705SXin Li   ///
297*67e74705SXin Li   /// By default, this routine transforms a type by delegating to the
298*67e74705SXin Li   /// appropriate TransformXXXType to build a new type.  Subclasses
299*67e74705SXin Li   /// may override this function (to take over all type
300*67e74705SXin Li   /// transformations) or some set of the TransformXXXType functions
301*67e74705SXin Li   /// to alter the transformation.
302*67e74705SXin Li   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
303*67e74705SXin Li 
304*67e74705SXin Li   /// \brief Transform the given type-with-location into a new
305*67e74705SXin Li   /// type, collecting location information in the given builder
306*67e74705SXin Li   /// as necessary.
307*67e74705SXin Li   ///
308*67e74705SXin Li   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
309*67e74705SXin Li 
310*67e74705SXin Li   /// \brief Transform the given statement.
311*67e74705SXin Li   ///
312*67e74705SXin Li   /// By default, this routine transforms a statement by delegating to the
313*67e74705SXin Li   /// appropriate TransformXXXStmt function to transform a specific kind of
314*67e74705SXin Li   /// statement or the TransformExpr() function to transform an expression.
315*67e74705SXin Li   /// Subclasses may override this function to transform statements using some
316*67e74705SXin Li   /// other mechanism.
317*67e74705SXin Li   ///
318*67e74705SXin Li   /// \returns the transformed statement.
319*67e74705SXin Li   StmtResult TransformStmt(Stmt *S);
320*67e74705SXin Li 
321*67e74705SXin Li   /// \brief Transform the given statement.
322*67e74705SXin Li   ///
323*67e74705SXin Li   /// By default, this routine transforms a statement by delegating to the
324*67e74705SXin Li   /// appropriate TransformOMPXXXClause function to transform a specific kind
325*67e74705SXin Li   /// of clause. Subclasses may override this function to transform statements
326*67e74705SXin Li   /// using some other mechanism.
327*67e74705SXin Li   ///
328*67e74705SXin Li   /// \returns the transformed OpenMP clause.
329*67e74705SXin Li   OMPClause *TransformOMPClause(OMPClause *S);
330*67e74705SXin Li 
331*67e74705SXin Li   /// \brief Transform the given attribute.
332*67e74705SXin Li   ///
333*67e74705SXin Li   /// By default, this routine transforms a statement by delegating to the
334*67e74705SXin Li   /// appropriate TransformXXXAttr function to transform a specific kind
335*67e74705SXin Li   /// of attribute. Subclasses may override this function to transform
336*67e74705SXin Li   /// attributed statements using some other mechanism.
337*67e74705SXin Li   ///
338*67e74705SXin Li   /// \returns the transformed attribute
339*67e74705SXin Li   const Attr *TransformAttr(const Attr *S);
340*67e74705SXin Li 
341*67e74705SXin Li /// \brief Transform the specified attribute.
342*67e74705SXin Li ///
343*67e74705SXin Li /// Subclasses should override the transformation of attributes with a pragma
344*67e74705SXin Li /// spelling to transform expressions stored within the attribute.
345*67e74705SXin Li ///
346*67e74705SXin Li /// \returns the transformed attribute.
347*67e74705SXin Li #define ATTR(X)
348*67e74705SXin Li #define PRAGMA_SPELLING_ATTR(X)                                                \
349*67e74705SXin Li   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
350*67e74705SXin Li #include "clang/Basic/AttrList.inc"
351*67e74705SXin Li 
352*67e74705SXin Li   /// \brief Transform the given expression.
353*67e74705SXin Li   ///
354*67e74705SXin Li   /// By default, this routine transforms an expression by delegating to the
355*67e74705SXin Li   /// appropriate TransformXXXExpr function to build a new expression.
356*67e74705SXin Li   /// Subclasses may override this function to transform expressions using some
357*67e74705SXin Li   /// other mechanism.
358*67e74705SXin Li   ///
359*67e74705SXin Li   /// \returns the transformed expression.
360*67e74705SXin Li   ExprResult TransformExpr(Expr *E);
361*67e74705SXin Li 
362*67e74705SXin Li   /// \brief Transform the given initializer.
363*67e74705SXin Li   ///
364*67e74705SXin Li   /// By default, this routine transforms an initializer by stripping off the
365*67e74705SXin Li   /// semantic nodes added by initialization, then passing the result to
366*67e74705SXin Li   /// TransformExpr or TransformExprs.
367*67e74705SXin Li   ///
368*67e74705SXin Li   /// \returns the transformed initializer.
369*67e74705SXin Li   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
370*67e74705SXin Li 
371*67e74705SXin Li   /// \brief Transform the given list of expressions.
372*67e74705SXin Li   ///
373*67e74705SXin Li   /// This routine transforms a list of expressions by invoking
374*67e74705SXin Li   /// \c TransformExpr() for each subexpression. However, it also provides
375*67e74705SXin Li   /// support for variadic templates by expanding any pack expansions (if the
376*67e74705SXin Li   /// derived class permits such expansion) along the way. When pack expansions
377*67e74705SXin Li   /// are present, the number of outputs may not equal the number of inputs.
378*67e74705SXin Li   ///
379*67e74705SXin Li   /// \param Inputs The set of expressions to be transformed.
380*67e74705SXin Li   ///
381*67e74705SXin Li   /// \param NumInputs The number of expressions in \c Inputs.
382*67e74705SXin Li   ///
383*67e74705SXin Li   /// \param IsCall If \c true, then this transform is being performed on
384*67e74705SXin Li   /// function-call arguments, and any arguments that should be dropped, will
385*67e74705SXin Li   /// be.
386*67e74705SXin Li   ///
387*67e74705SXin Li   /// \param Outputs The transformed input expressions will be added to this
388*67e74705SXin Li   /// vector.
389*67e74705SXin Li   ///
390*67e74705SXin Li   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
391*67e74705SXin Li   /// due to transformation.
392*67e74705SXin Li   ///
393*67e74705SXin Li   /// \returns true if an error occurred, false otherwise.
394*67e74705SXin Li   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
395*67e74705SXin Li                       SmallVectorImpl<Expr *> &Outputs,
396*67e74705SXin Li                       bool *ArgChanged = nullptr);
397*67e74705SXin Li 
398*67e74705SXin Li   /// \brief Transform the given declaration, which is referenced from a type
399*67e74705SXin Li   /// or expression.
400*67e74705SXin Li   ///
401*67e74705SXin Li   /// By default, acts as the identity function on declarations, unless the
402*67e74705SXin Li   /// transformer has had to transform the declaration itself. Subclasses
403*67e74705SXin Li   /// may override this function to provide alternate behavior.
TransformDecl(SourceLocation Loc,Decl * D)404*67e74705SXin Li   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
405*67e74705SXin Li     llvm::DenseMap<Decl *, Decl *>::iterator Known
406*67e74705SXin Li       = TransformedLocalDecls.find(D);
407*67e74705SXin Li     if (Known != TransformedLocalDecls.end())
408*67e74705SXin Li       return Known->second;
409*67e74705SXin Li 
410*67e74705SXin Li     return D;
411*67e74705SXin Li   }
412*67e74705SXin Li 
413*67e74705SXin Li   /// \brief Transform the specified condition.
414*67e74705SXin Li   ///
415*67e74705SXin Li   /// By default, this transforms the variable and expression and rebuilds
416*67e74705SXin Li   /// the condition.
417*67e74705SXin Li   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
418*67e74705SXin Li                                            Expr *Expr,
419*67e74705SXin Li                                            Sema::ConditionKind Kind);
420*67e74705SXin Li 
421*67e74705SXin Li   /// \brief Transform the attributes associated with the given declaration and
422*67e74705SXin Li   /// place them on the new declaration.
423*67e74705SXin Li   ///
424*67e74705SXin Li   /// By default, this operation does nothing. Subclasses may override this
425*67e74705SXin Li   /// behavior to transform attributes.
transformAttrs(Decl * Old,Decl * New)426*67e74705SXin Li   void transformAttrs(Decl *Old, Decl *New) { }
427*67e74705SXin Li 
428*67e74705SXin Li   /// \brief Note that a local declaration has been transformed by this
429*67e74705SXin Li   /// transformer.
430*67e74705SXin Li   ///
431*67e74705SXin Li   /// Local declarations are typically transformed via a call to
432*67e74705SXin Li   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
433*67e74705SXin Li   /// the transformer itself has to transform the declarations. This routine
434*67e74705SXin Li   /// can be overridden by a subclass that keeps track of such mappings.
transformedLocalDecl(Decl * Old,Decl * New)435*67e74705SXin Li   void transformedLocalDecl(Decl *Old, Decl *New) {
436*67e74705SXin Li     TransformedLocalDecls[Old] = New;
437*67e74705SXin Li   }
438*67e74705SXin Li 
439*67e74705SXin Li   /// \brief Transform the definition of the given declaration.
440*67e74705SXin Li   ///
441*67e74705SXin Li   /// By default, invokes TransformDecl() to transform the declaration.
442*67e74705SXin Li   /// Subclasses may override this function to provide alternate behavior.
TransformDefinition(SourceLocation Loc,Decl * D)443*67e74705SXin Li   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
444*67e74705SXin Li     return getDerived().TransformDecl(Loc, D);
445*67e74705SXin Li   }
446*67e74705SXin Li 
447*67e74705SXin Li   /// \brief Transform the given declaration, which was the first part of a
448*67e74705SXin Li   /// nested-name-specifier in a member access expression.
449*67e74705SXin Li   ///
450*67e74705SXin Li   /// This specific declaration transformation only applies to the first
451*67e74705SXin Li   /// identifier in a nested-name-specifier of a member access expression, e.g.,
452*67e74705SXin Li   /// the \c T in \c x->T::member
453*67e74705SXin Li   ///
454*67e74705SXin Li   /// By default, invokes TransformDecl() to transform the declaration.
455*67e74705SXin Li   /// Subclasses may override this function to provide alternate behavior.
TransformFirstQualifierInScope(NamedDecl * D,SourceLocation Loc)456*67e74705SXin Li   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
457*67e74705SXin Li     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
458*67e74705SXin Li   }
459*67e74705SXin Li 
460*67e74705SXin Li   /// \brief Transform the given nested-name-specifier with source-location
461*67e74705SXin Li   /// information.
462*67e74705SXin Li   ///
463*67e74705SXin Li   /// By default, transforms all of the types and declarations within the
464*67e74705SXin Li   /// nested-name-specifier. Subclasses may override this function to provide
465*67e74705SXin Li   /// alternate behavior.
466*67e74705SXin Li   NestedNameSpecifierLoc
467*67e74705SXin Li   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
468*67e74705SXin Li                                   QualType ObjectType = QualType(),
469*67e74705SXin Li                                   NamedDecl *FirstQualifierInScope = nullptr);
470*67e74705SXin Li 
471*67e74705SXin Li   /// \brief Transform the given declaration name.
472*67e74705SXin Li   ///
473*67e74705SXin Li   /// By default, transforms the types of conversion function, constructor,
474*67e74705SXin Li   /// and destructor names and then (if needed) rebuilds the declaration name.
475*67e74705SXin Li   /// Identifiers and selectors are returned unmodified. Sublcasses may
476*67e74705SXin Li   /// override this function to provide alternate behavior.
477*67e74705SXin Li   DeclarationNameInfo
478*67e74705SXin Li   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
479*67e74705SXin Li 
480*67e74705SXin Li   /// \brief Transform the given template name.
481*67e74705SXin Li   ///
482*67e74705SXin Li   /// \param SS The nested-name-specifier that qualifies the template
483*67e74705SXin Li   /// name. This nested-name-specifier must already have been transformed.
484*67e74705SXin Li   ///
485*67e74705SXin Li   /// \param Name The template name to transform.
486*67e74705SXin Li   ///
487*67e74705SXin Li   /// \param NameLoc The source location of the template name.
488*67e74705SXin Li   ///
489*67e74705SXin Li   /// \param ObjectType If we're translating a template name within a member
490*67e74705SXin Li   /// access expression, this is the type of the object whose member template
491*67e74705SXin Li   /// is being referenced.
492*67e74705SXin Li   ///
493*67e74705SXin Li   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
494*67e74705SXin Li   /// also refers to a name within the current (lexical) scope, this is the
495*67e74705SXin Li   /// declaration it refers to.
496*67e74705SXin Li   ///
497*67e74705SXin Li   /// By default, transforms the template name by transforming the declarations
498*67e74705SXin Li   /// and nested-name-specifiers that occur within the template name.
499*67e74705SXin Li   /// Subclasses may override this function to provide alternate behavior.
500*67e74705SXin Li   TemplateName
501*67e74705SXin Li   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
502*67e74705SXin Li                         SourceLocation NameLoc,
503*67e74705SXin Li                         QualType ObjectType = QualType(),
504*67e74705SXin Li                         NamedDecl *FirstQualifierInScope = nullptr);
505*67e74705SXin Li 
506*67e74705SXin Li   /// \brief Transform the given template argument.
507*67e74705SXin Li   ///
508*67e74705SXin Li   /// By default, this operation transforms the type, expression, or
509*67e74705SXin Li   /// declaration stored within the template argument and constructs a
510*67e74705SXin Li   /// new template argument from the transformed result. Subclasses may
511*67e74705SXin Li   /// override this function to provide alternate behavior.
512*67e74705SXin Li   ///
513*67e74705SXin Li   /// Returns true if there was an error.
514*67e74705SXin Li   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
515*67e74705SXin Li                                  TemplateArgumentLoc &Output,
516*67e74705SXin Li                                  bool Uneval = false);
517*67e74705SXin Li 
518*67e74705SXin Li   /// \brief Transform the given set of template arguments.
519*67e74705SXin Li   ///
520*67e74705SXin Li   /// By default, this operation transforms all of the template arguments
521*67e74705SXin Li   /// in the input set using \c TransformTemplateArgument(), and appends
522*67e74705SXin Li   /// the transformed arguments to the output list.
523*67e74705SXin Li   ///
524*67e74705SXin Li   /// Note that this overload of \c TransformTemplateArguments() is merely
525*67e74705SXin Li   /// a convenience function. Subclasses that wish to override this behavior
526*67e74705SXin Li   /// should override the iterator-based member template version.
527*67e74705SXin Li   ///
528*67e74705SXin Li   /// \param Inputs The set of template arguments to be transformed.
529*67e74705SXin Li   ///
530*67e74705SXin Li   /// \param NumInputs The number of template arguments in \p Inputs.
531*67e74705SXin Li   ///
532*67e74705SXin Li   /// \param Outputs The set of transformed template arguments output by this
533*67e74705SXin Li   /// routine.
534*67e74705SXin Li   ///
535*67e74705SXin Li   /// Returns true if an error occurred.
536*67e74705SXin Li   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
537*67e74705SXin Li                                   unsigned NumInputs,
538*67e74705SXin Li                                   TemplateArgumentListInfo &Outputs,
539*67e74705SXin Li                                   bool Uneval = false) {
540*67e74705SXin Li     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
541*67e74705SXin Li                                       Uneval);
542*67e74705SXin Li   }
543*67e74705SXin Li 
544*67e74705SXin Li   /// \brief Transform the given set of template arguments.
545*67e74705SXin Li   ///
546*67e74705SXin Li   /// By default, this operation transforms all of the template arguments
547*67e74705SXin Li   /// in the input set using \c TransformTemplateArgument(), and appends
548*67e74705SXin Li   /// the transformed arguments to the output list.
549*67e74705SXin Li   ///
550*67e74705SXin Li   /// \param First An iterator to the first template argument.
551*67e74705SXin Li   ///
552*67e74705SXin Li   /// \param Last An iterator one step past the last template argument.
553*67e74705SXin Li   ///
554*67e74705SXin Li   /// \param Outputs The set of transformed template arguments output by this
555*67e74705SXin Li   /// routine.
556*67e74705SXin Li   ///
557*67e74705SXin Li   /// Returns true if an error occurred.
558*67e74705SXin Li   template<typename InputIterator>
559*67e74705SXin Li   bool TransformTemplateArguments(InputIterator First,
560*67e74705SXin Li                                   InputIterator Last,
561*67e74705SXin Li                                   TemplateArgumentListInfo &Outputs,
562*67e74705SXin Li                                   bool Uneval = false);
563*67e74705SXin Li 
564*67e74705SXin Li   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
565*67e74705SXin Li   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
566*67e74705SXin Li                                  TemplateArgumentLoc &ArgLoc);
567*67e74705SXin Li 
568*67e74705SXin Li   /// \brief Fakes up a TypeSourceInfo for a type.
InventTypeSourceInfo(QualType T)569*67e74705SXin Li   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
570*67e74705SXin Li     return SemaRef.Context.getTrivialTypeSourceInfo(T,
571*67e74705SXin Li                        getDerived().getBaseLocation());
572*67e74705SXin Li   }
573*67e74705SXin Li 
574*67e74705SXin Li #define ABSTRACT_TYPELOC(CLASS, PARENT)
575*67e74705SXin Li #define TYPELOC(CLASS, PARENT)                                   \
576*67e74705SXin Li   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
577*67e74705SXin Li #include "clang/AST/TypeLocNodes.def"
578*67e74705SXin Li 
579*67e74705SXin Li   template<typename Fn>
580*67e74705SXin Li   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
581*67e74705SXin Li                                       FunctionProtoTypeLoc TL,
582*67e74705SXin Li                                       CXXRecordDecl *ThisContext,
583*67e74705SXin Li                                       unsigned ThisTypeQuals,
584*67e74705SXin Li                                       Fn TransformExceptionSpec);
585*67e74705SXin Li 
586*67e74705SXin Li   bool TransformExceptionSpec(SourceLocation Loc,
587*67e74705SXin Li                               FunctionProtoType::ExceptionSpecInfo &ESI,
588*67e74705SXin Li                               SmallVectorImpl<QualType> &Exceptions,
589*67e74705SXin Li                               bool &Changed);
590*67e74705SXin Li 
591*67e74705SXin Li   StmtResult TransformSEHHandler(Stmt *Handler);
592*67e74705SXin Li 
593*67e74705SXin Li   QualType
594*67e74705SXin Li   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
595*67e74705SXin Li                                       TemplateSpecializationTypeLoc TL,
596*67e74705SXin Li                                       TemplateName Template);
597*67e74705SXin Li 
598*67e74705SXin Li   QualType
599*67e74705SXin Li   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
600*67e74705SXin Li                                       DependentTemplateSpecializationTypeLoc TL,
601*67e74705SXin Li                                                TemplateName Template,
602*67e74705SXin Li                                                CXXScopeSpec &SS);
603*67e74705SXin Li 
604*67e74705SXin Li   QualType TransformDependentTemplateSpecializationType(
605*67e74705SXin Li       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
606*67e74705SXin Li       NestedNameSpecifierLoc QualifierLoc);
607*67e74705SXin Li 
608*67e74705SXin Li   /// \brief Transforms the parameters of a function type into the
609*67e74705SXin Li   /// given vectors.
610*67e74705SXin Li   ///
611*67e74705SXin Li   /// The result vectors should be kept in sync; null entries in the
612*67e74705SXin Li   /// variables vector are acceptable.
613*67e74705SXin Li   ///
614*67e74705SXin Li   /// Return true on error.
615*67e74705SXin Li   bool TransformFunctionTypeParams(
616*67e74705SXin Li       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
617*67e74705SXin Li       const QualType *ParamTypes,
618*67e74705SXin Li       const FunctionProtoType::ExtParameterInfo *ParamInfos,
619*67e74705SXin Li       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
620*67e74705SXin Li       Sema::ExtParameterInfoBuilder &PInfos);
621*67e74705SXin Li 
622*67e74705SXin Li   /// \brief Transforms a single function-type parameter.  Return null
623*67e74705SXin Li   /// on error.
624*67e74705SXin Li   ///
625*67e74705SXin Li   /// \param indexAdjustment - A number to add to the parameter's
626*67e74705SXin Li   ///   scope index;  can be negative
627*67e74705SXin Li   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
628*67e74705SXin Li                                           int indexAdjustment,
629*67e74705SXin Li                                           Optional<unsigned> NumExpansions,
630*67e74705SXin Li                                           bool ExpectParameterPack);
631*67e74705SXin Li 
632*67e74705SXin Li   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
633*67e74705SXin Li 
634*67e74705SXin Li   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
635*67e74705SXin Li   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
636*67e74705SXin Li 
TransformTemplateParameterList(TemplateParameterList * TPL)637*67e74705SXin Li   TemplateParameterList *TransformTemplateParameterList(
638*67e74705SXin Li         TemplateParameterList *TPL) {
639*67e74705SXin Li     return TPL;
640*67e74705SXin Li   }
641*67e74705SXin Li 
642*67e74705SXin Li   ExprResult TransformAddressOfOperand(Expr *E);
643*67e74705SXin Li 
644*67e74705SXin Li   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
645*67e74705SXin Li                                                 bool IsAddressOfOperand,
646*67e74705SXin Li                                                 TypeSourceInfo **RecoveryTSI);
647*67e74705SXin Li 
648*67e74705SXin Li   ExprResult TransformParenDependentScopeDeclRefExpr(
649*67e74705SXin Li       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
650*67e74705SXin Li       TypeSourceInfo **RecoveryTSI);
651*67e74705SXin Li 
652*67e74705SXin Li   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
653*67e74705SXin Li 
654*67e74705SXin Li // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
655*67e74705SXin Li // amount of stack usage with clang.
656*67e74705SXin Li #define STMT(Node, Parent)                        \
657*67e74705SXin Li   LLVM_ATTRIBUTE_NOINLINE \
658*67e74705SXin Li   StmtResult Transform##Node(Node *S);
659*67e74705SXin Li #define EXPR(Node, Parent)                        \
660*67e74705SXin Li   LLVM_ATTRIBUTE_NOINLINE \
661*67e74705SXin Li   ExprResult Transform##Node(Node *E);
662*67e74705SXin Li #define ABSTRACT_STMT(Stmt)
663*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
664*67e74705SXin Li 
665*67e74705SXin Li #define OPENMP_CLAUSE(Name, Class)                        \
666*67e74705SXin Li   LLVM_ATTRIBUTE_NOINLINE \
667*67e74705SXin Li   OMPClause *Transform ## Class(Class *S);
668*67e74705SXin Li #include "clang/Basic/OpenMPKinds.def"
669*67e74705SXin Li 
670*67e74705SXin Li   /// \brief Build a new pointer type given its pointee type.
671*67e74705SXin Li   ///
672*67e74705SXin Li   /// By default, performs semantic analysis when building the pointer type.
673*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
674*67e74705SXin Li   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
675*67e74705SXin Li 
676*67e74705SXin Li   /// \brief Build a new block pointer type given its pointee type.
677*67e74705SXin Li   ///
678*67e74705SXin Li   /// By default, performs semantic analysis when building the block pointer
679*67e74705SXin Li   /// type. Subclasses may override this routine to provide different behavior.
680*67e74705SXin Li   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
681*67e74705SXin Li 
682*67e74705SXin Li   /// \brief Build a new reference type given the type it references.
683*67e74705SXin Li   ///
684*67e74705SXin Li   /// By default, performs semantic analysis when building the
685*67e74705SXin Li   /// reference type. Subclasses may override this routine to provide
686*67e74705SXin Li   /// different behavior.
687*67e74705SXin Li   ///
688*67e74705SXin Li   /// \param LValue whether the type was written with an lvalue sigil
689*67e74705SXin Li   /// or an rvalue sigil.
690*67e74705SXin Li   QualType RebuildReferenceType(QualType ReferentType,
691*67e74705SXin Li                                 bool LValue,
692*67e74705SXin Li                                 SourceLocation Sigil);
693*67e74705SXin Li 
694*67e74705SXin Li   /// \brief Build a new member pointer type given the pointee type and the
695*67e74705SXin Li   /// class type it refers into.
696*67e74705SXin Li   ///
697*67e74705SXin Li   /// By default, performs semantic analysis when building the member pointer
698*67e74705SXin Li   /// type. Subclasses may override this routine to provide different behavior.
699*67e74705SXin Li   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
700*67e74705SXin Li                                     SourceLocation Sigil);
701*67e74705SXin Li 
702*67e74705SXin Li   /// \brief Build an Objective-C object type.
703*67e74705SXin Li   ///
704*67e74705SXin Li   /// By default, performs semantic analysis when building the object type.
705*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
706*67e74705SXin Li   QualType RebuildObjCObjectType(QualType BaseType,
707*67e74705SXin Li                                  SourceLocation Loc,
708*67e74705SXin Li                                  SourceLocation TypeArgsLAngleLoc,
709*67e74705SXin Li                                  ArrayRef<TypeSourceInfo *> TypeArgs,
710*67e74705SXin Li                                  SourceLocation TypeArgsRAngleLoc,
711*67e74705SXin Li                                  SourceLocation ProtocolLAngleLoc,
712*67e74705SXin Li                                  ArrayRef<ObjCProtocolDecl *> Protocols,
713*67e74705SXin Li                                  ArrayRef<SourceLocation> ProtocolLocs,
714*67e74705SXin Li                                  SourceLocation ProtocolRAngleLoc);
715*67e74705SXin Li 
716*67e74705SXin Li   /// \brief Build a new Objective-C object pointer type given the pointee type.
717*67e74705SXin Li   ///
718*67e74705SXin Li   /// By default, directly builds the pointer type, with no additional semantic
719*67e74705SXin Li   /// analysis.
720*67e74705SXin Li   QualType RebuildObjCObjectPointerType(QualType PointeeType,
721*67e74705SXin Li                                         SourceLocation Star);
722*67e74705SXin Li 
723*67e74705SXin Li   /// \brief Build a new array type given the element type, size
724*67e74705SXin Li   /// modifier, size of the array (if known), size expression, and index type
725*67e74705SXin Li   /// qualifiers.
726*67e74705SXin Li   ///
727*67e74705SXin Li   /// By default, performs semantic analysis when building the array type.
728*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
729*67e74705SXin Li   /// Also by default, all of the other Rebuild*Array
730*67e74705SXin Li   QualType RebuildArrayType(QualType ElementType,
731*67e74705SXin Li                             ArrayType::ArraySizeModifier SizeMod,
732*67e74705SXin Li                             const llvm::APInt *Size,
733*67e74705SXin Li                             Expr *SizeExpr,
734*67e74705SXin Li                             unsigned IndexTypeQuals,
735*67e74705SXin Li                             SourceRange BracketsRange);
736*67e74705SXin Li 
737*67e74705SXin Li   /// \brief Build a new constant array type given the element type, size
738*67e74705SXin Li   /// modifier, (known) size of the array, and index type qualifiers.
739*67e74705SXin Li   ///
740*67e74705SXin Li   /// By default, performs semantic analysis when building the array type.
741*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
742*67e74705SXin Li   QualType RebuildConstantArrayType(QualType ElementType,
743*67e74705SXin Li                                     ArrayType::ArraySizeModifier SizeMod,
744*67e74705SXin Li                                     const llvm::APInt &Size,
745*67e74705SXin Li                                     unsigned IndexTypeQuals,
746*67e74705SXin Li                                     SourceRange BracketsRange);
747*67e74705SXin Li 
748*67e74705SXin Li   /// \brief Build a new incomplete array type given the element type, size
749*67e74705SXin Li   /// modifier, and index type qualifiers.
750*67e74705SXin Li   ///
751*67e74705SXin Li   /// By default, performs semantic analysis when building the array type.
752*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
753*67e74705SXin Li   QualType RebuildIncompleteArrayType(QualType ElementType,
754*67e74705SXin Li                                       ArrayType::ArraySizeModifier SizeMod,
755*67e74705SXin Li                                       unsigned IndexTypeQuals,
756*67e74705SXin Li                                       SourceRange BracketsRange);
757*67e74705SXin Li 
758*67e74705SXin Li   /// \brief Build a new variable-length array type given the element type,
759*67e74705SXin Li   /// size modifier, size expression, and index type qualifiers.
760*67e74705SXin Li   ///
761*67e74705SXin Li   /// By default, performs semantic analysis when building the array type.
762*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
763*67e74705SXin Li   QualType RebuildVariableArrayType(QualType ElementType,
764*67e74705SXin Li                                     ArrayType::ArraySizeModifier SizeMod,
765*67e74705SXin Li                                     Expr *SizeExpr,
766*67e74705SXin Li                                     unsigned IndexTypeQuals,
767*67e74705SXin Li                                     SourceRange BracketsRange);
768*67e74705SXin Li 
769*67e74705SXin Li   /// \brief Build a new dependent-sized array type given the element type,
770*67e74705SXin Li   /// size modifier, size expression, and index type qualifiers.
771*67e74705SXin Li   ///
772*67e74705SXin Li   /// By default, performs semantic analysis when building the array type.
773*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
774*67e74705SXin Li   QualType RebuildDependentSizedArrayType(QualType ElementType,
775*67e74705SXin Li                                           ArrayType::ArraySizeModifier SizeMod,
776*67e74705SXin Li                                           Expr *SizeExpr,
777*67e74705SXin Li                                           unsigned IndexTypeQuals,
778*67e74705SXin Li                                           SourceRange BracketsRange);
779*67e74705SXin Li 
780*67e74705SXin Li   /// \brief Build a new vector type given the element type and
781*67e74705SXin Li   /// number of elements.
782*67e74705SXin Li   ///
783*67e74705SXin Li   /// By default, performs semantic analysis when building the vector type.
784*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
785*67e74705SXin Li   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
786*67e74705SXin Li                              VectorType::VectorKind VecKind);
787*67e74705SXin Li 
788*67e74705SXin Li   /// \brief Build a new extended vector type given the element type and
789*67e74705SXin Li   /// number of elements.
790*67e74705SXin Li   ///
791*67e74705SXin Li   /// By default, performs semantic analysis when building the vector type.
792*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
793*67e74705SXin Li   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
794*67e74705SXin Li                                 SourceLocation AttributeLoc);
795*67e74705SXin Li 
796*67e74705SXin Li   /// \brief Build a new potentially dependently-sized extended vector type
797*67e74705SXin Li   /// given the element type and number of elements.
798*67e74705SXin Li   ///
799*67e74705SXin Li   /// By default, performs semantic analysis when building the vector type.
800*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
801*67e74705SXin Li   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
802*67e74705SXin Li                                               Expr *SizeExpr,
803*67e74705SXin Li                                               SourceLocation AttributeLoc);
804*67e74705SXin Li 
805*67e74705SXin Li   /// \brief Build a new function type.
806*67e74705SXin Li   ///
807*67e74705SXin Li   /// By default, performs semantic analysis when building the function type.
808*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
809*67e74705SXin Li   QualType RebuildFunctionProtoType(QualType T,
810*67e74705SXin Li                                     MutableArrayRef<QualType> ParamTypes,
811*67e74705SXin Li                                     const FunctionProtoType::ExtProtoInfo &EPI);
812*67e74705SXin Li 
813*67e74705SXin Li   /// \brief Build a new unprototyped function type.
814*67e74705SXin Li   QualType RebuildFunctionNoProtoType(QualType ResultType);
815*67e74705SXin Li 
816*67e74705SXin Li   /// \brief Rebuild an unresolved typename type, given the decl that
817*67e74705SXin Li   /// the UnresolvedUsingTypenameDecl was transformed to.
818*67e74705SXin Li   QualType RebuildUnresolvedUsingType(Decl *D);
819*67e74705SXin Li 
820*67e74705SXin Li   /// \brief Build a new typedef type.
RebuildTypedefType(TypedefNameDecl * Typedef)821*67e74705SXin Li   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
822*67e74705SXin Li     return SemaRef.Context.getTypeDeclType(Typedef);
823*67e74705SXin Li   }
824*67e74705SXin Li 
825*67e74705SXin Li   /// \brief Build a new class/struct/union type.
RebuildRecordType(RecordDecl * Record)826*67e74705SXin Li   QualType RebuildRecordType(RecordDecl *Record) {
827*67e74705SXin Li     return SemaRef.Context.getTypeDeclType(Record);
828*67e74705SXin Li   }
829*67e74705SXin Li 
830*67e74705SXin Li   /// \brief Build a new Enum type.
RebuildEnumType(EnumDecl * Enum)831*67e74705SXin Li   QualType RebuildEnumType(EnumDecl *Enum) {
832*67e74705SXin Li     return SemaRef.Context.getTypeDeclType(Enum);
833*67e74705SXin Li   }
834*67e74705SXin Li 
835*67e74705SXin Li   /// \brief Build a new typeof(expr) type.
836*67e74705SXin Li   ///
837*67e74705SXin Li   /// By default, performs semantic analysis when building the typeof type.
838*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
839*67e74705SXin Li   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
840*67e74705SXin Li 
841*67e74705SXin Li   /// \brief Build a new typeof(type) type.
842*67e74705SXin Li   ///
843*67e74705SXin Li   /// By default, builds a new TypeOfType with the given underlying type.
844*67e74705SXin Li   QualType RebuildTypeOfType(QualType Underlying);
845*67e74705SXin Li 
846*67e74705SXin Li   /// \brief Build a new unary transform type.
847*67e74705SXin Li   QualType RebuildUnaryTransformType(QualType BaseType,
848*67e74705SXin Li                                      UnaryTransformType::UTTKind UKind,
849*67e74705SXin Li                                      SourceLocation Loc);
850*67e74705SXin Li 
851*67e74705SXin Li   /// \brief Build a new C++11 decltype type.
852*67e74705SXin Li   ///
853*67e74705SXin Li   /// By default, performs semantic analysis when building the decltype type.
854*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
855*67e74705SXin Li   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
856*67e74705SXin Li 
857*67e74705SXin Li   /// \brief Build a new C++11 auto type.
858*67e74705SXin Li   ///
859*67e74705SXin Li   /// By default, builds a new AutoType with the given deduced type.
RebuildAutoType(QualType Deduced,AutoTypeKeyword Keyword)860*67e74705SXin Li   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
861*67e74705SXin Li     // Note, IsDependent is always false here: we implicitly convert an 'auto'
862*67e74705SXin Li     // which has been deduced to a dependent type into an undeduced 'auto', so
863*67e74705SXin Li     // that we'll retry deduction after the transformation.
864*67e74705SXin Li     return SemaRef.Context.getAutoType(Deduced, Keyword,
865*67e74705SXin Li                                        /*IsDependent*/ false);
866*67e74705SXin Li   }
867*67e74705SXin Li 
868*67e74705SXin Li   /// \brief Build a new template specialization type.
869*67e74705SXin Li   ///
870*67e74705SXin Li   /// By default, performs semantic analysis when building the template
871*67e74705SXin Li   /// specialization type. Subclasses may override this routine to provide
872*67e74705SXin Li   /// different behavior.
873*67e74705SXin Li   QualType RebuildTemplateSpecializationType(TemplateName Template,
874*67e74705SXin Li                                              SourceLocation TemplateLoc,
875*67e74705SXin Li                                              TemplateArgumentListInfo &Args);
876*67e74705SXin Li 
877*67e74705SXin Li   /// \brief Build a new parenthesized type.
878*67e74705SXin Li   ///
879*67e74705SXin Li   /// By default, builds a new ParenType type from the inner type.
880*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildParenType(QualType InnerType)881*67e74705SXin Li   QualType RebuildParenType(QualType InnerType) {
882*67e74705SXin Li     return SemaRef.Context.getParenType(InnerType);
883*67e74705SXin Li   }
884*67e74705SXin Li 
885*67e74705SXin Li   /// \brief Build a new qualified name type.
886*67e74705SXin Li   ///
887*67e74705SXin Li   /// By default, builds a new ElaboratedType type from the keyword,
888*67e74705SXin Li   /// the nested-name-specifier and the named type.
889*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType Named)890*67e74705SXin Li   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
891*67e74705SXin Li                                  ElaboratedTypeKeyword Keyword,
892*67e74705SXin Li                                  NestedNameSpecifierLoc QualifierLoc,
893*67e74705SXin Li                                  QualType Named) {
894*67e74705SXin Li     return SemaRef.Context.getElaboratedType(Keyword,
895*67e74705SXin Li                                          QualifierLoc.getNestedNameSpecifier(),
896*67e74705SXin Li                                              Named);
897*67e74705SXin Li   }
898*67e74705SXin Li 
899*67e74705SXin Li   /// \brief Build a new typename type that refers to a template-id.
900*67e74705SXin Li   ///
901*67e74705SXin Li   /// By default, builds a new DependentNameType type from the
902*67e74705SXin Li   /// nested-name-specifier and the given type. Subclasses may override
903*67e74705SXin Li   /// this routine to provide different behavior.
RebuildDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Name,SourceLocation NameLoc,TemplateArgumentListInfo & Args)904*67e74705SXin Li   QualType RebuildDependentTemplateSpecializationType(
905*67e74705SXin Li                                           ElaboratedTypeKeyword Keyword,
906*67e74705SXin Li                                           NestedNameSpecifierLoc QualifierLoc,
907*67e74705SXin Li                                           const IdentifierInfo *Name,
908*67e74705SXin Li                                           SourceLocation NameLoc,
909*67e74705SXin Li                                           TemplateArgumentListInfo &Args) {
910*67e74705SXin Li     // Rebuild the template name.
911*67e74705SXin Li     // TODO: avoid TemplateName abstraction
912*67e74705SXin Li     CXXScopeSpec SS;
913*67e74705SXin Li     SS.Adopt(QualifierLoc);
914*67e74705SXin Li     TemplateName InstName
915*67e74705SXin Li       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
916*67e74705SXin Li                                          nullptr);
917*67e74705SXin Li 
918*67e74705SXin Li     if (InstName.isNull())
919*67e74705SXin Li       return QualType();
920*67e74705SXin Li 
921*67e74705SXin Li     // If it's still dependent, make a dependent specialization.
922*67e74705SXin Li     if (InstName.getAsDependentTemplateName())
923*67e74705SXin Li       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
924*67e74705SXin Li                                           QualifierLoc.getNestedNameSpecifier(),
925*67e74705SXin Li                                                                     Name,
926*67e74705SXin Li                                                                     Args);
927*67e74705SXin Li 
928*67e74705SXin Li     // Otherwise, make an elaborated type wrapping a non-dependent
929*67e74705SXin Li     // specialization.
930*67e74705SXin Li     QualType T =
931*67e74705SXin Li     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
932*67e74705SXin Li     if (T.isNull()) return QualType();
933*67e74705SXin Li 
934*67e74705SXin Li     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
935*67e74705SXin Li       return T;
936*67e74705SXin Li 
937*67e74705SXin Li     return SemaRef.Context.getElaboratedType(Keyword,
938*67e74705SXin Li                                        QualifierLoc.getNestedNameSpecifier(),
939*67e74705SXin Li                                              T);
940*67e74705SXin Li   }
941*67e74705SXin Li 
942*67e74705SXin Li   /// \brief Build a new typename type that refers to an identifier.
943*67e74705SXin Li   ///
944*67e74705SXin Li   /// By default, performs semantic analysis when building the typename type
945*67e74705SXin Li   /// (or elaborated type). Subclasses may override this routine to provide
946*67e74705SXin Li   /// different behavior.
RebuildDependentNameType(ElaboratedTypeKeyword Keyword,SourceLocation KeywordLoc,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Id,SourceLocation IdLoc)947*67e74705SXin Li   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
948*67e74705SXin Li                                     SourceLocation KeywordLoc,
949*67e74705SXin Li                                     NestedNameSpecifierLoc QualifierLoc,
950*67e74705SXin Li                                     const IdentifierInfo *Id,
951*67e74705SXin Li                                     SourceLocation IdLoc) {
952*67e74705SXin Li     CXXScopeSpec SS;
953*67e74705SXin Li     SS.Adopt(QualifierLoc);
954*67e74705SXin Li 
955*67e74705SXin Li     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
956*67e74705SXin Li       // If the name is still dependent, just build a new dependent name type.
957*67e74705SXin Li       if (!SemaRef.computeDeclContext(SS))
958*67e74705SXin Li         return SemaRef.Context.getDependentNameType(Keyword,
959*67e74705SXin Li                                           QualifierLoc.getNestedNameSpecifier(),
960*67e74705SXin Li                                                     Id);
961*67e74705SXin Li     }
962*67e74705SXin Li 
963*67e74705SXin Li     if (Keyword == ETK_None || Keyword == ETK_Typename)
964*67e74705SXin Li       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
965*67e74705SXin Li                                        *Id, IdLoc);
966*67e74705SXin Li 
967*67e74705SXin Li     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
968*67e74705SXin Li 
969*67e74705SXin Li     // We had a dependent elaborated-type-specifier that has been transformed
970*67e74705SXin Li     // into a non-dependent elaborated-type-specifier. Find the tag we're
971*67e74705SXin Li     // referring to.
972*67e74705SXin Li     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
973*67e74705SXin Li     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
974*67e74705SXin Li     if (!DC)
975*67e74705SXin Li       return QualType();
976*67e74705SXin Li 
977*67e74705SXin Li     if (SemaRef.RequireCompleteDeclContext(SS, DC))
978*67e74705SXin Li       return QualType();
979*67e74705SXin Li 
980*67e74705SXin Li     TagDecl *Tag = nullptr;
981*67e74705SXin Li     SemaRef.LookupQualifiedName(Result, DC);
982*67e74705SXin Li     switch (Result.getResultKind()) {
983*67e74705SXin Li       case LookupResult::NotFound:
984*67e74705SXin Li       case LookupResult::NotFoundInCurrentInstantiation:
985*67e74705SXin Li         break;
986*67e74705SXin Li 
987*67e74705SXin Li       case LookupResult::Found:
988*67e74705SXin Li         Tag = Result.getAsSingle<TagDecl>();
989*67e74705SXin Li         break;
990*67e74705SXin Li 
991*67e74705SXin Li       case LookupResult::FoundOverloaded:
992*67e74705SXin Li       case LookupResult::FoundUnresolvedValue:
993*67e74705SXin Li         llvm_unreachable("Tag lookup cannot find non-tags");
994*67e74705SXin Li 
995*67e74705SXin Li       case LookupResult::Ambiguous:
996*67e74705SXin Li         // Let the LookupResult structure handle ambiguities.
997*67e74705SXin Li         return QualType();
998*67e74705SXin Li     }
999*67e74705SXin Li 
1000*67e74705SXin Li     if (!Tag) {
1001*67e74705SXin Li       // Check where the name exists but isn't a tag type and use that to emit
1002*67e74705SXin Li       // better diagnostics.
1003*67e74705SXin Li       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1004*67e74705SXin Li       SemaRef.LookupQualifiedName(Result, DC);
1005*67e74705SXin Li       switch (Result.getResultKind()) {
1006*67e74705SXin Li         case LookupResult::Found:
1007*67e74705SXin Li         case LookupResult::FoundOverloaded:
1008*67e74705SXin Li         case LookupResult::FoundUnresolvedValue: {
1009*67e74705SXin Li           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1010*67e74705SXin Li           unsigned Kind = 0;
1011*67e74705SXin Li           if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
1012*67e74705SXin Li           else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
1013*67e74705SXin Li           else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
1014*67e74705SXin Li           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
1015*67e74705SXin Li           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1016*67e74705SXin Li           break;
1017*67e74705SXin Li         }
1018*67e74705SXin Li         default:
1019*67e74705SXin Li           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1020*67e74705SXin Li               << Kind << Id << DC << QualifierLoc.getSourceRange();
1021*67e74705SXin Li           break;
1022*67e74705SXin Li       }
1023*67e74705SXin Li       return QualType();
1024*67e74705SXin Li     }
1025*67e74705SXin Li 
1026*67e74705SXin Li     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1027*67e74705SXin Li                                               IdLoc, Id)) {
1028*67e74705SXin Li       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1029*67e74705SXin Li       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1030*67e74705SXin Li       return QualType();
1031*67e74705SXin Li     }
1032*67e74705SXin Li 
1033*67e74705SXin Li     // Build the elaborated-type-specifier type.
1034*67e74705SXin Li     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1035*67e74705SXin Li     return SemaRef.Context.getElaboratedType(Keyword,
1036*67e74705SXin Li                                          QualifierLoc.getNestedNameSpecifier(),
1037*67e74705SXin Li                                              T);
1038*67e74705SXin Li   }
1039*67e74705SXin Li 
1040*67e74705SXin Li   /// \brief Build a new pack expansion type.
1041*67e74705SXin Li   ///
1042*67e74705SXin Li   /// By default, builds a new PackExpansionType type from the given pattern.
1043*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildPackExpansionType(QualType Pattern,SourceRange PatternRange,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)1044*67e74705SXin Li   QualType RebuildPackExpansionType(QualType Pattern,
1045*67e74705SXin Li                                     SourceRange PatternRange,
1046*67e74705SXin Li                                     SourceLocation EllipsisLoc,
1047*67e74705SXin Li                                     Optional<unsigned> NumExpansions) {
1048*67e74705SXin Li     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1049*67e74705SXin Li                                         NumExpansions);
1050*67e74705SXin Li   }
1051*67e74705SXin Li 
1052*67e74705SXin Li   /// \brief Build a new atomic type given its value type.
1053*67e74705SXin Li   ///
1054*67e74705SXin Li   /// By default, performs semantic analysis when building the atomic type.
1055*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
1056*67e74705SXin Li   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1057*67e74705SXin Li 
1058*67e74705SXin Li   /// \brief Build a new pipe type given its value type.
1059*67e74705SXin Li   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc);
1060*67e74705SXin Li 
1061*67e74705SXin Li   /// \brief Build a new template name given a nested name specifier, a flag
1062*67e74705SXin Li   /// indicating whether the "template" keyword was provided, and the template
1063*67e74705SXin Li   /// that the template name refers to.
1064*67e74705SXin Li   ///
1065*67e74705SXin Li   /// By default, builds the new template name directly. Subclasses may override
1066*67e74705SXin Li   /// this routine to provide different behavior.
1067*67e74705SXin Li   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1068*67e74705SXin Li                                    bool TemplateKW,
1069*67e74705SXin Li                                    TemplateDecl *Template);
1070*67e74705SXin Li 
1071*67e74705SXin Li   /// \brief Build a new template name given a nested name specifier and the
1072*67e74705SXin Li   /// name that is referred to as a template.
1073*67e74705SXin Li   ///
1074*67e74705SXin Li   /// By default, performs semantic analysis to determine whether the name can
1075*67e74705SXin Li   /// be resolved to a specific template, then builds the appropriate kind of
1076*67e74705SXin Li   /// template name. Subclasses may override this routine to provide different
1077*67e74705SXin Li   /// behavior.
1078*67e74705SXin Li   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1079*67e74705SXin Li                                    const IdentifierInfo &Name,
1080*67e74705SXin Li                                    SourceLocation NameLoc,
1081*67e74705SXin Li                                    QualType ObjectType,
1082*67e74705SXin Li                                    NamedDecl *FirstQualifierInScope);
1083*67e74705SXin Li 
1084*67e74705SXin Li   /// \brief Build a new template name given a nested name specifier and the
1085*67e74705SXin Li   /// overloaded operator name that is referred to as a template.
1086*67e74705SXin Li   ///
1087*67e74705SXin Li   /// By default, performs semantic analysis to determine whether the name can
1088*67e74705SXin Li   /// be resolved to a specific template, then builds the appropriate kind of
1089*67e74705SXin Li   /// template name. Subclasses may override this routine to provide different
1090*67e74705SXin Li   /// behavior.
1091*67e74705SXin Li   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1092*67e74705SXin Li                                    OverloadedOperatorKind Operator,
1093*67e74705SXin Li                                    SourceLocation NameLoc,
1094*67e74705SXin Li                                    QualType ObjectType);
1095*67e74705SXin Li 
1096*67e74705SXin Li   /// \brief Build a new template name given a template template parameter pack
1097*67e74705SXin Li   /// and the
1098*67e74705SXin Li   ///
1099*67e74705SXin Li   /// By default, performs semantic analysis to determine whether the name can
1100*67e74705SXin Li   /// be resolved to a specific template, then builds the appropriate kind of
1101*67e74705SXin Li   /// template name. Subclasses may override this routine to provide different
1102*67e74705SXin Li   /// behavior.
RebuildTemplateName(TemplateTemplateParmDecl * Param,const TemplateArgument & ArgPack)1103*67e74705SXin Li   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1104*67e74705SXin Li                                    const TemplateArgument &ArgPack) {
1105*67e74705SXin Li     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1106*67e74705SXin Li   }
1107*67e74705SXin Li 
1108*67e74705SXin Li   /// \brief Build a new compound statement.
1109*67e74705SXin Li   ///
1110*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1111*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundStmt(SourceLocation LBraceLoc,MultiStmtArg Statements,SourceLocation RBraceLoc,bool IsStmtExpr)1112*67e74705SXin Li   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1113*67e74705SXin Li                                        MultiStmtArg Statements,
1114*67e74705SXin Li                                        SourceLocation RBraceLoc,
1115*67e74705SXin Li                                        bool IsStmtExpr) {
1116*67e74705SXin Li     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1117*67e74705SXin Li                                        IsStmtExpr);
1118*67e74705SXin Li   }
1119*67e74705SXin Li 
1120*67e74705SXin Li   /// \brief Build a new case statement.
1121*67e74705SXin Li   ///
1122*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1123*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmt(SourceLocation CaseLoc,Expr * LHS,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation ColonLoc)1124*67e74705SXin Li   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1125*67e74705SXin Li                                    Expr *LHS,
1126*67e74705SXin Li                                    SourceLocation EllipsisLoc,
1127*67e74705SXin Li                                    Expr *RHS,
1128*67e74705SXin Li                                    SourceLocation ColonLoc) {
1129*67e74705SXin Li     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1130*67e74705SXin Li                                    ColonLoc);
1131*67e74705SXin Li   }
1132*67e74705SXin Li 
1133*67e74705SXin Li   /// \brief Attach the body to a new case statement.
1134*67e74705SXin Li   ///
1135*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1136*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmtBody(Stmt * S,Stmt * Body)1137*67e74705SXin Li   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1138*67e74705SXin Li     getSema().ActOnCaseStmtBody(S, Body);
1139*67e74705SXin Li     return S;
1140*67e74705SXin Li   }
1141*67e74705SXin Li 
1142*67e74705SXin Li   /// \brief Build a new default statement.
1143*67e74705SXin Li   ///
1144*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1145*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt)1146*67e74705SXin Li   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1147*67e74705SXin Li                                       SourceLocation ColonLoc,
1148*67e74705SXin Li                                       Stmt *SubStmt) {
1149*67e74705SXin Li     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1150*67e74705SXin Li                                       /*CurScope=*/nullptr);
1151*67e74705SXin Li   }
1152*67e74705SXin Li 
1153*67e74705SXin Li   /// \brief Build a new label statement.
1154*67e74705SXin Li   ///
1155*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1156*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildLabelStmt(SourceLocation IdentLoc,LabelDecl * L,SourceLocation ColonLoc,Stmt * SubStmt)1157*67e74705SXin Li   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1158*67e74705SXin Li                               SourceLocation ColonLoc, Stmt *SubStmt) {
1159*67e74705SXin Li     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1160*67e74705SXin Li   }
1161*67e74705SXin Li 
1162*67e74705SXin Li   /// \brief Build a new label statement.
1163*67e74705SXin Li   ///
1164*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1165*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildAttributedStmt(SourceLocation AttrLoc,ArrayRef<const Attr * > Attrs,Stmt * SubStmt)1166*67e74705SXin Li   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1167*67e74705SXin Li                                    ArrayRef<const Attr*> Attrs,
1168*67e74705SXin Li                                    Stmt *SubStmt) {
1169*67e74705SXin Li     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1170*67e74705SXin Li   }
1171*67e74705SXin Li 
1172*67e74705SXin Li   /// \brief Build a new "if" statement.
1173*67e74705SXin Li   ///
1174*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1175*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildIfStmt(SourceLocation IfLoc,bool IsConstexpr,Sema::ConditionResult Cond,Stmt * Init,Stmt * Then,SourceLocation ElseLoc,Stmt * Else)1176*67e74705SXin Li   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1177*67e74705SXin Li                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1178*67e74705SXin Li                            SourceLocation ElseLoc, Stmt *Else) {
1179*67e74705SXin Li     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1180*67e74705SXin Li                                  ElseLoc, Else);
1181*67e74705SXin Li   }
1182*67e74705SXin Li 
1183*67e74705SXin Li   /// \brief Start building a new switch statement.
1184*67e74705SXin Li   ///
1185*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1186*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtStart(SourceLocation SwitchLoc,Stmt * Init,Sema::ConditionResult Cond)1187*67e74705SXin Li   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1188*67e74705SXin Li                                     Sema::ConditionResult Cond) {
1189*67e74705SXin Li     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1190*67e74705SXin Li   }
1191*67e74705SXin Li 
1192*67e74705SXin Li   /// \brief Attach the body to the switch statement.
1193*67e74705SXin Li   ///
1194*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1195*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtBody(SourceLocation SwitchLoc,Stmt * Switch,Stmt * Body)1196*67e74705SXin Li   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1197*67e74705SXin Li                                    Stmt *Switch, Stmt *Body) {
1198*67e74705SXin Li     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1199*67e74705SXin Li   }
1200*67e74705SXin Li 
1201*67e74705SXin Li   /// \brief Build a new while statement.
1202*67e74705SXin Li   ///
1203*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1204*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildWhileStmt(SourceLocation WhileLoc,Sema::ConditionResult Cond,Stmt * Body)1205*67e74705SXin Li   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1206*67e74705SXin Li                               Sema::ConditionResult Cond, Stmt *Body) {
1207*67e74705SXin Li     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1208*67e74705SXin Li   }
1209*67e74705SXin Li 
1210*67e74705SXin Li   /// \brief Build a new do-while statement.
1211*67e74705SXin Li   ///
1212*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1213*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation LParenLoc,Expr * Cond,SourceLocation RParenLoc)1214*67e74705SXin Li   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1215*67e74705SXin Li                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1216*67e74705SXin Li                            Expr *Cond, SourceLocation RParenLoc) {
1217*67e74705SXin Li     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1218*67e74705SXin Li                                  Cond, RParenLoc);
1219*67e74705SXin Li   }
1220*67e74705SXin Li 
1221*67e74705SXin Li   /// \brief Build a new for statement.
1222*67e74705SXin Li   ///
1223*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1224*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Init,Sema::ConditionResult Cond,Sema::FullExprArg Inc,SourceLocation RParenLoc,Stmt * Body)1225*67e74705SXin Li   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1226*67e74705SXin Li                             Stmt *Init, Sema::ConditionResult Cond,
1227*67e74705SXin Li                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1228*67e74705SXin Li                             Stmt *Body) {
1229*67e74705SXin Li     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1230*67e74705SXin Li                                   Inc, RParenLoc, Body);
1231*67e74705SXin Li   }
1232*67e74705SXin Li 
1233*67e74705SXin Li   /// \brief Build a new goto statement.
1234*67e74705SXin Li   ///
1235*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1236*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * Label)1237*67e74705SXin Li   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1238*67e74705SXin Li                              LabelDecl *Label) {
1239*67e74705SXin Li     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1240*67e74705SXin Li   }
1241*67e74705SXin Li 
1242*67e74705SXin Li   /// \brief Build a new indirect goto statement.
1243*67e74705SXin Li   ///
1244*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1245*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * Target)1246*67e74705SXin Li   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1247*67e74705SXin Li                                      SourceLocation StarLoc,
1248*67e74705SXin Li                                      Expr *Target) {
1249*67e74705SXin Li     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1250*67e74705SXin Li   }
1251*67e74705SXin Li 
1252*67e74705SXin Li   /// \brief Build a new return statement.
1253*67e74705SXin Li   ///
1254*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1255*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildReturnStmt(SourceLocation ReturnLoc,Expr * Result)1256*67e74705SXin Li   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1257*67e74705SXin Li     return getSema().BuildReturnStmt(ReturnLoc, Result);
1258*67e74705SXin Li   }
1259*67e74705SXin Li 
1260*67e74705SXin Li   /// \brief Build a new declaration statement.
1261*67e74705SXin Li   ///
1262*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1263*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDeclStmt(MutableArrayRef<Decl * > Decls,SourceLocation StartLoc,SourceLocation EndLoc)1264*67e74705SXin Li   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1265*67e74705SXin Li                              SourceLocation StartLoc, SourceLocation EndLoc) {
1266*67e74705SXin Li     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1267*67e74705SXin Li     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1268*67e74705SXin Li   }
1269*67e74705SXin Li 
1270*67e74705SXin Li   /// \brief Build a new inline asm statement.
1271*67e74705SXin Li   ///
1272*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1273*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildGCCAsmStmt(SourceLocation AsmLoc,bool IsSimple,bool IsVolatile,unsigned NumOutputs,unsigned NumInputs,IdentifierInfo ** Names,MultiExprArg Constraints,MultiExprArg Exprs,Expr * AsmString,MultiExprArg Clobbers,SourceLocation RParenLoc)1274*67e74705SXin Li   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1275*67e74705SXin Li                                bool IsVolatile, unsigned NumOutputs,
1276*67e74705SXin Li                                unsigned NumInputs, IdentifierInfo **Names,
1277*67e74705SXin Li                                MultiExprArg Constraints, MultiExprArg Exprs,
1278*67e74705SXin Li                                Expr *AsmString, MultiExprArg Clobbers,
1279*67e74705SXin Li                                SourceLocation RParenLoc) {
1280*67e74705SXin Li     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1281*67e74705SXin Li                                      NumInputs, Names, Constraints, Exprs,
1282*67e74705SXin Li                                      AsmString, Clobbers, RParenLoc);
1283*67e74705SXin Li   }
1284*67e74705SXin Li 
1285*67e74705SXin Li   /// \brief Build a new MS style inline asm statement.
1286*67e74705SXin Li   ///
1287*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1288*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildMSAsmStmt(SourceLocation AsmLoc,SourceLocation LBraceLoc,ArrayRef<Token> AsmToks,StringRef AsmString,unsigned NumOutputs,unsigned NumInputs,ArrayRef<StringRef> Constraints,ArrayRef<StringRef> Clobbers,ArrayRef<Expr * > Exprs,SourceLocation EndLoc)1289*67e74705SXin Li   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1290*67e74705SXin Li                               ArrayRef<Token> AsmToks,
1291*67e74705SXin Li                               StringRef AsmString,
1292*67e74705SXin Li                               unsigned NumOutputs, unsigned NumInputs,
1293*67e74705SXin Li                               ArrayRef<StringRef> Constraints,
1294*67e74705SXin Li                               ArrayRef<StringRef> Clobbers,
1295*67e74705SXin Li                               ArrayRef<Expr*> Exprs,
1296*67e74705SXin Li                               SourceLocation EndLoc) {
1297*67e74705SXin Li     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1298*67e74705SXin Li                                     NumOutputs, NumInputs,
1299*67e74705SXin Li                                     Constraints, Clobbers, Exprs, EndLoc);
1300*67e74705SXin Li   }
1301*67e74705SXin Li 
1302*67e74705SXin Li   /// \brief Build a new co_return statement.
1303*67e74705SXin Li   ///
1304*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1305*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCoreturnStmt(SourceLocation CoreturnLoc,Expr * Result)1306*67e74705SXin Li   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result) {
1307*67e74705SXin Li     return getSema().BuildCoreturnStmt(CoreturnLoc, Result);
1308*67e74705SXin Li   }
1309*67e74705SXin Li 
1310*67e74705SXin Li   /// \brief Build a new co_await expression.
1311*67e74705SXin Li   ///
1312*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
1313*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCoawaitExpr(SourceLocation CoawaitLoc,Expr * Result)1314*67e74705SXin Li   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result) {
1315*67e74705SXin Li     return getSema().BuildCoawaitExpr(CoawaitLoc, Result);
1316*67e74705SXin Li   }
1317*67e74705SXin Li 
1318*67e74705SXin Li   /// \brief Build a new co_yield expression.
1319*67e74705SXin Li   ///
1320*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
1321*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCoyieldExpr(SourceLocation CoyieldLoc,Expr * Result)1322*67e74705SXin Li   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1323*67e74705SXin Li     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1324*67e74705SXin Li   }
1325*67e74705SXin Li 
1326*67e74705SXin Li   /// \brief Build a new Objective-C \@try statement.
1327*67e74705SXin Li   ///
1328*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1329*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtTryStmt(SourceLocation AtLoc,Stmt * TryBody,MultiStmtArg CatchStmts,Stmt * Finally)1330*67e74705SXin Li   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1331*67e74705SXin Li                                         Stmt *TryBody,
1332*67e74705SXin Li                                         MultiStmtArg CatchStmts,
1333*67e74705SXin Li                                         Stmt *Finally) {
1334*67e74705SXin Li     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1335*67e74705SXin Li                                         Finally);
1336*67e74705SXin Li   }
1337*67e74705SXin Li 
1338*67e74705SXin Li   /// \brief Rebuild an Objective-C exception declaration.
1339*67e74705SXin Li   ///
1340*67e74705SXin Li   /// By default, performs semantic analysis to build the new declaration.
1341*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TInfo,QualType T)1342*67e74705SXin Li   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1343*67e74705SXin Li                                     TypeSourceInfo *TInfo, QualType T) {
1344*67e74705SXin Li     return getSema().BuildObjCExceptionDecl(TInfo, T,
1345*67e74705SXin Li                                             ExceptionDecl->getInnerLocStart(),
1346*67e74705SXin Li                                             ExceptionDecl->getLocation(),
1347*67e74705SXin Li                                             ExceptionDecl->getIdentifier());
1348*67e74705SXin Li   }
1349*67e74705SXin Li 
1350*67e74705SXin Li   /// \brief Build a new Objective-C \@catch statement.
1351*67e74705SXin Li   ///
1352*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1353*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParenLoc,VarDecl * Var,Stmt * Body)1354*67e74705SXin Li   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1355*67e74705SXin Li                                           SourceLocation RParenLoc,
1356*67e74705SXin Li                                           VarDecl *Var,
1357*67e74705SXin Li                                           Stmt *Body) {
1358*67e74705SXin Li     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1359*67e74705SXin Li                                           Var, Body);
1360*67e74705SXin Li   }
1361*67e74705SXin Li 
1362*67e74705SXin Li   /// \brief Build a new Objective-C \@finally statement.
1363*67e74705SXin Li   ///
1364*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1365*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)1366*67e74705SXin Li   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1367*67e74705SXin Li                                             Stmt *Body) {
1368*67e74705SXin Li     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1369*67e74705SXin Li   }
1370*67e74705SXin Li 
1371*67e74705SXin Li   /// \brief Build a new Objective-C \@throw statement.
1372*67e74705SXin Li   ///
1373*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1374*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Operand)1375*67e74705SXin Li   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1376*67e74705SXin Li                                           Expr *Operand) {
1377*67e74705SXin Li     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1378*67e74705SXin Li   }
1379*67e74705SXin Li 
1380*67e74705SXin Li   /// \brief Build a new OpenMP executable directive.
1381*67e74705SXin Li   ///
1382*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1383*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,DeclarationNameInfo DirName,OpenMPDirectiveKind CancelRegion,ArrayRef<OMPClause * > Clauses,Stmt * AStmt,SourceLocation StartLoc,SourceLocation EndLoc)1384*67e74705SXin Li   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1385*67e74705SXin Li                                            DeclarationNameInfo DirName,
1386*67e74705SXin Li                                            OpenMPDirectiveKind CancelRegion,
1387*67e74705SXin Li                                            ArrayRef<OMPClause *> Clauses,
1388*67e74705SXin Li                                            Stmt *AStmt, SourceLocation StartLoc,
1389*67e74705SXin Li                                            SourceLocation EndLoc) {
1390*67e74705SXin Li     return getSema().ActOnOpenMPExecutableDirective(
1391*67e74705SXin Li         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1392*67e74705SXin Li   }
1393*67e74705SXin Li 
1394*67e74705SXin Li   /// \brief Build a new OpenMP 'if' clause.
1395*67e74705SXin Li   ///
1396*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1397*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation NameModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1398*67e74705SXin Li   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1399*67e74705SXin Li                                 Expr *Condition, SourceLocation StartLoc,
1400*67e74705SXin Li                                 SourceLocation LParenLoc,
1401*67e74705SXin Li                                 SourceLocation NameModifierLoc,
1402*67e74705SXin Li                                 SourceLocation ColonLoc,
1403*67e74705SXin Li                                 SourceLocation EndLoc) {
1404*67e74705SXin Li     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1405*67e74705SXin Li                                          LParenLoc, NameModifierLoc, ColonLoc,
1406*67e74705SXin Li                                          EndLoc);
1407*67e74705SXin Li   }
1408*67e74705SXin Li 
1409*67e74705SXin Li   /// \brief Build a new OpenMP 'final' clause.
1410*67e74705SXin Li   ///
1411*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1412*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFinalClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1413*67e74705SXin Li   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1414*67e74705SXin Li                                    SourceLocation LParenLoc,
1415*67e74705SXin Li                                    SourceLocation EndLoc) {
1416*67e74705SXin Li     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1417*67e74705SXin Li                                             EndLoc);
1418*67e74705SXin Li   }
1419*67e74705SXin Li 
1420*67e74705SXin Li   /// \brief Build a new OpenMP 'num_threads' clause.
1421*67e74705SXin Li   ///
1422*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1423*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumThreadsClause(Expr * NumThreads,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1424*67e74705SXin Li   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1425*67e74705SXin Li                                         SourceLocation StartLoc,
1426*67e74705SXin Li                                         SourceLocation LParenLoc,
1427*67e74705SXin Li                                         SourceLocation EndLoc) {
1428*67e74705SXin Li     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1429*67e74705SXin Li                                                  LParenLoc, EndLoc);
1430*67e74705SXin Li   }
1431*67e74705SXin Li 
1432*67e74705SXin Li   /// \brief Build a new OpenMP 'safelen' clause.
1433*67e74705SXin Li   ///
1434*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1435*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSafelenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1436*67e74705SXin Li   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1437*67e74705SXin Li                                      SourceLocation LParenLoc,
1438*67e74705SXin Li                                      SourceLocation EndLoc) {
1439*67e74705SXin Li     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1440*67e74705SXin Li   }
1441*67e74705SXin Li 
1442*67e74705SXin Li   /// \brief Build a new OpenMP 'simdlen' clause.
1443*67e74705SXin Li   ///
1444*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1445*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSimdlenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1446*67e74705SXin Li   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1447*67e74705SXin Li                                      SourceLocation LParenLoc,
1448*67e74705SXin Li                                      SourceLocation EndLoc) {
1449*67e74705SXin Li     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1450*67e74705SXin Li   }
1451*67e74705SXin Li 
1452*67e74705SXin Li   /// \brief Build a new OpenMP 'collapse' clause.
1453*67e74705SXin Li   ///
1454*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1455*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCollapseClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1456*67e74705SXin Li   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1457*67e74705SXin Li                                       SourceLocation LParenLoc,
1458*67e74705SXin Li                                       SourceLocation EndLoc) {
1459*67e74705SXin Li     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1460*67e74705SXin Li                                                EndLoc);
1461*67e74705SXin Li   }
1462*67e74705SXin Li 
1463*67e74705SXin Li   /// \brief Build a new OpenMP 'default' clause.
1464*67e74705SXin Li   ///
1465*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1466*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1467*67e74705SXin Li   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1468*67e74705SXin Li                                      SourceLocation KindKwLoc,
1469*67e74705SXin Li                                      SourceLocation StartLoc,
1470*67e74705SXin Li                                      SourceLocation LParenLoc,
1471*67e74705SXin Li                                      SourceLocation EndLoc) {
1472*67e74705SXin Li     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1473*67e74705SXin Li                                               StartLoc, LParenLoc, EndLoc);
1474*67e74705SXin Li   }
1475*67e74705SXin Li 
1476*67e74705SXin Li   /// \brief Build a new OpenMP 'proc_bind' clause.
1477*67e74705SXin Li   ///
1478*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1479*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1480*67e74705SXin Li   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1481*67e74705SXin Li                                       SourceLocation KindKwLoc,
1482*67e74705SXin Li                                       SourceLocation StartLoc,
1483*67e74705SXin Li                                       SourceLocation LParenLoc,
1484*67e74705SXin Li                                       SourceLocation EndLoc) {
1485*67e74705SXin Li     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1486*67e74705SXin Li                                                StartLoc, LParenLoc, EndLoc);
1487*67e74705SXin Li   }
1488*67e74705SXin Li 
1489*67e74705SXin Li   /// \brief Build a new OpenMP 'schedule' clause.
1490*67e74705SXin Li   ///
1491*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1492*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPScheduleClause(OpenMPScheduleClauseModifier M1,OpenMPScheduleClauseModifier M2,OpenMPScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation M1Loc,SourceLocation M2Loc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)1493*67e74705SXin Li   OMPClause *RebuildOMPScheduleClause(
1494*67e74705SXin Li       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1495*67e74705SXin Li       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1496*67e74705SXin Li       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1497*67e74705SXin Li       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1498*67e74705SXin Li     return getSema().ActOnOpenMPScheduleClause(
1499*67e74705SXin Li         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1500*67e74705SXin Li         CommaLoc, EndLoc);
1501*67e74705SXin Li   }
1502*67e74705SXin Li 
1503*67e74705SXin Li   /// \brief Build a new OpenMP 'ordered' clause.
1504*67e74705SXin Li   ///
1505*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1506*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPOrderedClause(SourceLocation StartLoc,SourceLocation EndLoc,SourceLocation LParenLoc,Expr * Num)1507*67e74705SXin Li   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1508*67e74705SXin Li                                      SourceLocation EndLoc,
1509*67e74705SXin Li                                      SourceLocation LParenLoc, Expr *Num) {
1510*67e74705SXin Li     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1511*67e74705SXin Li   }
1512*67e74705SXin Li 
1513*67e74705SXin Li   /// \brief Build a new OpenMP 'private' clause.
1514*67e74705SXin Li   ///
1515*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1516*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPrivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1517*67e74705SXin Li   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1518*67e74705SXin Li                                      SourceLocation StartLoc,
1519*67e74705SXin Li                                      SourceLocation LParenLoc,
1520*67e74705SXin Li                                      SourceLocation EndLoc) {
1521*67e74705SXin Li     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1522*67e74705SXin Li                                               EndLoc);
1523*67e74705SXin Li   }
1524*67e74705SXin Li 
1525*67e74705SXin Li   /// \brief Build a new OpenMP 'firstprivate' clause.
1526*67e74705SXin Li   ///
1527*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1528*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFirstprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1529*67e74705SXin Li   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1530*67e74705SXin Li                                           SourceLocation StartLoc,
1531*67e74705SXin Li                                           SourceLocation LParenLoc,
1532*67e74705SXin Li                                           SourceLocation EndLoc) {
1533*67e74705SXin Li     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1534*67e74705SXin Li                                                    EndLoc);
1535*67e74705SXin Li   }
1536*67e74705SXin Li 
1537*67e74705SXin Li   /// \brief Build a new OpenMP 'lastprivate' clause.
1538*67e74705SXin Li   ///
1539*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1540*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPLastprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1541*67e74705SXin Li   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1542*67e74705SXin Li                                          SourceLocation StartLoc,
1543*67e74705SXin Li                                          SourceLocation LParenLoc,
1544*67e74705SXin Li                                          SourceLocation EndLoc) {
1545*67e74705SXin Li     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1546*67e74705SXin Li                                                   EndLoc);
1547*67e74705SXin Li   }
1548*67e74705SXin Li 
1549*67e74705SXin Li   /// \brief Build a new OpenMP 'shared' clause.
1550*67e74705SXin Li   ///
1551*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1552*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPSharedClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1553*67e74705SXin Li   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1554*67e74705SXin Li                                     SourceLocation StartLoc,
1555*67e74705SXin Li                                     SourceLocation LParenLoc,
1556*67e74705SXin Li                                     SourceLocation EndLoc) {
1557*67e74705SXin Li     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1558*67e74705SXin Li                                              EndLoc);
1559*67e74705SXin Li   }
1560*67e74705SXin Li 
1561*67e74705SXin Li   /// \brief Build a new OpenMP 'reduction' clause.
1562*67e74705SXin Li   ///
1563*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1564*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPReductionClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,CXXScopeSpec & ReductionIdScopeSpec,const DeclarationNameInfo & ReductionId,ArrayRef<Expr * > UnresolvedReductions)1565*67e74705SXin Li   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1566*67e74705SXin Li                                        SourceLocation StartLoc,
1567*67e74705SXin Li                                        SourceLocation LParenLoc,
1568*67e74705SXin Li                                        SourceLocation ColonLoc,
1569*67e74705SXin Li                                        SourceLocation EndLoc,
1570*67e74705SXin Li                                        CXXScopeSpec &ReductionIdScopeSpec,
1571*67e74705SXin Li                                        const DeclarationNameInfo &ReductionId,
1572*67e74705SXin Li                                        ArrayRef<Expr *> UnresolvedReductions) {
1573*67e74705SXin Li     return getSema().ActOnOpenMPReductionClause(
1574*67e74705SXin Li         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1575*67e74705SXin Li         ReductionId, UnresolvedReductions);
1576*67e74705SXin Li   }
1577*67e74705SXin Li 
1578*67e74705SXin Li   /// \brief Build a new OpenMP 'linear' clause.
1579*67e74705SXin Li   ///
1580*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1581*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPLinearClause(ArrayRef<Expr * > VarList,Expr * Step,SourceLocation StartLoc,SourceLocation LParenLoc,OpenMPLinearClauseKind Modifier,SourceLocation ModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1582*67e74705SXin Li   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1583*67e74705SXin Li                                     SourceLocation StartLoc,
1584*67e74705SXin Li                                     SourceLocation LParenLoc,
1585*67e74705SXin Li                                     OpenMPLinearClauseKind Modifier,
1586*67e74705SXin Li                                     SourceLocation ModifierLoc,
1587*67e74705SXin Li                                     SourceLocation ColonLoc,
1588*67e74705SXin Li                                     SourceLocation EndLoc) {
1589*67e74705SXin Li     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1590*67e74705SXin Li                                              Modifier, ModifierLoc, ColonLoc,
1591*67e74705SXin Li                                              EndLoc);
1592*67e74705SXin Li   }
1593*67e74705SXin Li 
1594*67e74705SXin Li   /// \brief Build a new OpenMP 'aligned' clause.
1595*67e74705SXin Li   ///
1596*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1597*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPAlignedClause(ArrayRef<Expr * > VarList,Expr * Alignment,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1598*67e74705SXin Li   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1599*67e74705SXin Li                                      SourceLocation StartLoc,
1600*67e74705SXin Li                                      SourceLocation LParenLoc,
1601*67e74705SXin Li                                      SourceLocation ColonLoc,
1602*67e74705SXin Li                                      SourceLocation EndLoc) {
1603*67e74705SXin Li     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1604*67e74705SXin Li                                               LParenLoc, ColonLoc, EndLoc);
1605*67e74705SXin Li   }
1606*67e74705SXin Li 
1607*67e74705SXin Li   /// \brief Build a new OpenMP 'copyin' clause.
1608*67e74705SXin Li   ///
1609*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1610*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyinClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1611*67e74705SXin Li   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1612*67e74705SXin Li                                     SourceLocation StartLoc,
1613*67e74705SXin Li                                     SourceLocation LParenLoc,
1614*67e74705SXin Li                                     SourceLocation EndLoc) {
1615*67e74705SXin Li     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1616*67e74705SXin Li                                              EndLoc);
1617*67e74705SXin Li   }
1618*67e74705SXin Li 
1619*67e74705SXin Li   /// \brief Build a new OpenMP 'copyprivate' clause.
1620*67e74705SXin Li   ///
1621*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1622*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1623*67e74705SXin Li   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1624*67e74705SXin Li                                          SourceLocation StartLoc,
1625*67e74705SXin Li                                          SourceLocation LParenLoc,
1626*67e74705SXin Li                                          SourceLocation EndLoc) {
1627*67e74705SXin Li     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1628*67e74705SXin Li                                                   EndLoc);
1629*67e74705SXin Li   }
1630*67e74705SXin Li 
1631*67e74705SXin Li   /// \brief Build a new OpenMP 'flush' pseudo clause.
1632*67e74705SXin Li   ///
1633*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1634*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFlushClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1635*67e74705SXin Li   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1636*67e74705SXin Li                                    SourceLocation StartLoc,
1637*67e74705SXin Li                                    SourceLocation LParenLoc,
1638*67e74705SXin Li                                    SourceLocation EndLoc) {
1639*67e74705SXin Li     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1640*67e74705SXin Li                                             EndLoc);
1641*67e74705SXin Li   }
1642*67e74705SXin Li 
1643*67e74705SXin Li   /// \brief Build a new OpenMP 'depend' pseudo clause.
1644*67e74705SXin Li   ///
1645*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1646*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
1647*67e74705SXin Li   OMPClause *
RebuildOMPDependClause(OpenMPDependClauseKind DepKind,SourceLocation DepLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1648*67e74705SXin Li   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1649*67e74705SXin Li                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1650*67e74705SXin Li                          SourceLocation StartLoc, SourceLocation LParenLoc,
1651*67e74705SXin Li                          SourceLocation EndLoc) {
1652*67e74705SXin Li     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1653*67e74705SXin Li                                              StartLoc, LParenLoc, EndLoc);
1654*67e74705SXin Li   }
1655*67e74705SXin Li 
1656*67e74705SXin Li   /// \brief Build a new OpenMP 'device' clause.
1657*67e74705SXin Li   ///
1658*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1659*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPDeviceClause(Expr * Device,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1660*67e74705SXin Li   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1661*67e74705SXin Li                                     SourceLocation LParenLoc,
1662*67e74705SXin Li                                     SourceLocation EndLoc) {
1663*67e74705SXin Li     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1664*67e74705SXin Li                                              EndLoc);
1665*67e74705SXin Li   }
1666*67e74705SXin Li 
1667*67e74705SXin Li   /// \brief Build a new OpenMP 'map' clause.
1668*67e74705SXin Li   ///
1669*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1670*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
1671*67e74705SXin Li   OMPClause *
RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,OpenMPMapClauseKind MapType,bool IsMapTypeImplicit,SourceLocation MapLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1672*67e74705SXin Li   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1673*67e74705SXin Li                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1674*67e74705SXin Li                       SourceLocation MapLoc, SourceLocation ColonLoc,
1675*67e74705SXin Li                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1676*67e74705SXin Li                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1677*67e74705SXin Li     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1678*67e74705SXin Li                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1679*67e74705SXin Li                                           VarList, StartLoc, LParenLoc, EndLoc);
1680*67e74705SXin Li   }
1681*67e74705SXin Li 
1682*67e74705SXin Li   /// \brief Build a new OpenMP 'num_teams' clause.
1683*67e74705SXin Li   ///
1684*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1685*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumTeamsClause(Expr * NumTeams,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1686*67e74705SXin Li   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1687*67e74705SXin Li                                       SourceLocation LParenLoc,
1688*67e74705SXin Li                                       SourceLocation EndLoc) {
1689*67e74705SXin Li     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1690*67e74705SXin Li                                                EndLoc);
1691*67e74705SXin Li   }
1692*67e74705SXin Li 
1693*67e74705SXin Li   /// \brief Build a new OpenMP 'thread_limit' clause.
1694*67e74705SXin Li   ///
1695*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1696*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPThreadLimitClause(Expr * ThreadLimit,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1697*67e74705SXin Li   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1698*67e74705SXin Li                                          SourceLocation StartLoc,
1699*67e74705SXin Li                                          SourceLocation LParenLoc,
1700*67e74705SXin Li                                          SourceLocation EndLoc) {
1701*67e74705SXin Li     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1702*67e74705SXin Li                                                   LParenLoc, EndLoc);
1703*67e74705SXin Li   }
1704*67e74705SXin Li 
1705*67e74705SXin Li   /// \brief Build a new OpenMP 'priority' clause.
1706*67e74705SXin Li   ///
1707*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1708*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPPriorityClause(Expr * Priority,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1709*67e74705SXin Li   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1710*67e74705SXin Li                                       SourceLocation LParenLoc,
1711*67e74705SXin Li                                       SourceLocation EndLoc) {
1712*67e74705SXin Li     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1713*67e74705SXin Li                                                EndLoc);
1714*67e74705SXin Li   }
1715*67e74705SXin Li 
1716*67e74705SXin Li   /// \brief Build a new OpenMP 'grainsize' clause.
1717*67e74705SXin Li   ///
1718*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1719*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPGrainsizeClause(Expr * Grainsize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1720*67e74705SXin Li   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1721*67e74705SXin Li                                        SourceLocation LParenLoc,
1722*67e74705SXin Li                                        SourceLocation EndLoc) {
1723*67e74705SXin Li     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1724*67e74705SXin Li                                                 EndLoc);
1725*67e74705SXin Li   }
1726*67e74705SXin Li 
1727*67e74705SXin Li   /// \brief Build a new OpenMP 'num_tasks' clause.
1728*67e74705SXin Li   ///
1729*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1730*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumTasksClause(Expr * NumTasks,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1731*67e74705SXin Li   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1732*67e74705SXin Li                                       SourceLocation LParenLoc,
1733*67e74705SXin Li                                       SourceLocation EndLoc) {
1734*67e74705SXin Li     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1735*67e74705SXin Li                                                EndLoc);
1736*67e74705SXin Li   }
1737*67e74705SXin Li 
1738*67e74705SXin Li   /// \brief Build a new OpenMP 'hint' clause.
1739*67e74705SXin Li   ///
1740*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1741*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPHintClause(Expr * Hint,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1742*67e74705SXin Li   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1743*67e74705SXin Li                                   SourceLocation LParenLoc,
1744*67e74705SXin Li                                   SourceLocation EndLoc) {
1745*67e74705SXin Li     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1746*67e74705SXin Li   }
1747*67e74705SXin Li 
1748*67e74705SXin Li   /// \brief Build a new OpenMP 'dist_schedule' clause.
1749*67e74705SXin Li   ///
1750*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1751*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
1752*67e74705SXin Li   OMPClause *
RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)1753*67e74705SXin Li   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1754*67e74705SXin Li                                Expr *ChunkSize, SourceLocation StartLoc,
1755*67e74705SXin Li                                SourceLocation LParenLoc, SourceLocation KindLoc,
1756*67e74705SXin Li                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1757*67e74705SXin Li     return getSema().ActOnOpenMPDistScheduleClause(
1758*67e74705SXin Li         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1759*67e74705SXin Li   }
1760*67e74705SXin Li 
1761*67e74705SXin Li   /// \brief Build a new OpenMP 'to' clause.
1762*67e74705SXin Li   ///
1763*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1764*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPToClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1765*67e74705SXin Li   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1766*67e74705SXin Li                                 SourceLocation StartLoc,
1767*67e74705SXin Li                                 SourceLocation LParenLoc,
1768*67e74705SXin Li                                 SourceLocation EndLoc) {
1769*67e74705SXin Li     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1770*67e74705SXin Li   }
1771*67e74705SXin Li 
1772*67e74705SXin Li   /// \brief Build a new OpenMP 'from' clause.
1773*67e74705SXin Li   ///
1774*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1775*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPFromClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1776*67e74705SXin Li   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1777*67e74705SXin Li                                   SourceLocation StartLoc,
1778*67e74705SXin Li                                   SourceLocation LParenLoc,
1779*67e74705SXin Li                                   SourceLocation EndLoc) {
1780*67e74705SXin Li     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1781*67e74705SXin Li                                            EndLoc);
1782*67e74705SXin Li   }
1783*67e74705SXin Li 
1784*67e74705SXin Li   /// Build a new OpenMP 'use_device_ptr' clause.
1785*67e74705SXin Li   ///
1786*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1787*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPUseDevicePtrClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1788*67e74705SXin Li   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1789*67e74705SXin Li                                           SourceLocation StartLoc,
1790*67e74705SXin Li                                           SourceLocation LParenLoc,
1791*67e74705SXin Li                                           SourceLocation EndLoc) {
1792*67e74705SXin Li     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1793*67e74705SXin Li                                                    EndLoc);
1794*67e74705SXin Li   }
1795*67e74705SXin Li 
1796*67e74705SXin Li   /// Build a new OpenMP 'is_device_ptr' clause.
1797*67e74705SXin Li   ///
1798*67e74705SXin Li   /// By default, performs semantic analysis to build the new OpenMP clause.
1799*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPIsDevicePtrClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1800*67e74705SXin Li   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1801*67e74705SXin Li                                          SourceLocation StartLoc,
1802*67e74705SXin Li                                          SourceLocation LParenLoc,
1803*67e74705SXin Li                                          SourceLocation EndLoc) {
1804*67e74705SXin Li     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1805*67e74705SXin Li                                                   EndLoc);
1806*67e74705SXin Li   }
1807*67e74705SXin Li 
1808*67e74705SXin Li   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1809*67e74705SXin Li   ///
1810*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1811*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,Expr * object)1812*67e74705SXin Li   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1813*67e74705SXin Li                                               Expr *object) {
1814*67e74705SXin Li     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1815*67e74705SXin Li   }
1816*67e74705SXin Li 
1817*67e74705SXin Li   /// \brief Build a new Objective-C \@synchronized statement.
1818*67e74705SXin Li   ///
1819*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1820*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * Object,Stmt * Body)1821*67e74705SXin Li   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1822*67e74705SXin Li                                            Expr *Object, Stmt *Body) {
1823*67e74705SXin Li     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1824*67e74705SXin Li   }
1825*67e74705SXin Li 
1826*67e74705SXin Li   /// \brief Build a new Objective-C \@autoreleasepool statement.
1827*67e74705SXin Li   ///
1828*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1829*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)1830*67e74705SXin Li   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1831*67e74705SXin Li                                             Stmt *Body) {
1832*67e74705SXin Li     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1833*67e74705SXin Li   }
1834*67e74705SXin Li 
1835*67e74705SXin Li   /// \brief Build a new Objective-C fast enumeration statement.
1836*67e74705SXin Li   ///
1837*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1838*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCForCollectionStmt(SourceLocation ForLoc,Stmt * Element,Expr * Collection,SourceLocation RParenLoc,Stmt * Body)1839*67e74705SXin Li   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1840*67e74705SXin Li                                           Stmt *Element,
1841*67e74705SXin Li                                           Expr *Collection,
1842*67e74705SXin Li                                           SourceLocation RParenLoc,
1843*67e74705SXin Li                                           Stmt *Body) {
1844*67e74705SXin Li     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1845*67e74705SXin Li                                                 Element,
1846*67e74705SXin Li                                                 Collection,
1847*67e74705SXin Li                                                 RParenLoc);
1848*67e74705SXin Li     if (ForEachStmt.isInvalid())
1849*67e74705SXin Li       return StmtError();
1850*67e74705SXin Li 
1851*67e74705SXin Li     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1852*67e74705SXin Li   }
1853*67e74705SXin Li 
1854*67e74705SXin Li   /// \brief Build a new C++ exception declaration.
1855*67e74705SXin Li   ///
1856*67e74705SXin Li   /// By default, performs semantic analysis to build the new decaration.
1857*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id)1858*67e74705SXin Li   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1859*67e74705SXin Li                                 TypeSourceInfo *Declarator,
1860*67e74705SXin Li                                 SourceLocation StartLoc,
1861*67e74705SXin Li                                 SourceLocation IdLoc,
1862*67e74705SXin Li                                 IdentifierInfo *Id) {
1863*67e74705SXin Li     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1864*67e74705SXin Li                                                        StartLoc, IdLoc, Id);
1865*67e74705SXin Li     if (Var)
1866*67e74705SXin Li       getSema().CurContext->addDecl(Var);
1867*67e74705SXin Li     return Var;
1868*67e74705SXin Li   }
1869*67e74705SXin Li 
1870*67e74705SXin Li   /// \brief Build a new C++ catch statement.
1871*67e74705SXin Li   ///
1872*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1873*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXCatchStmt(SourceLocation CatchLoc,VarDecl * ExceptionDecl,Stmt * Handler)1874*67e74705SXin Li   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1875*67e74705SXin Li                                  VarDecl *ExceptionDecl,
1876*67e74705SXin Li                                  Stmt *Handler) {
1877*67e74705SXin Li     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1878*67e74705SXin Li                                                       Handler));
1879*67e74705SXin Li   }
1880*67e74705SXin Li 
1881*67e74705SXin Li   /// \brief Build a new C++ try statement.
1882*67e74705SXin Li   ///
1883*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1884*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTryStmt(SourceLocation TryLoc,Stmt * TryBlock,ArrayRef<Stmt * > Handlers)1885*67e74705SXin Li   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1886*67e74705SXin Li                                ArrayRef<Stmt *> Handlers) {
1887*67e74705SXin Li     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1888*67e74705SXin Li   }
1889*67e74705SXin Li 
1890*67e74705SXin Li   /// \brief Build a new C++0x range-based for statement.
1891*67e74705SXin Li   ///
1892*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1893*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXForRangeStmt(SourceLocation ForLoc,SourceLocation CoawaitLoc,SourceLocation ColonLoc,Stmt * Range,Stmt * Begin,Stmt * End,Expr * Cond,Expr * Inc,Stmt * LoopVar,SourceLocation RParenLoc)1894*67e74705SXin Li   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1895*67e74705SXin Li                                     SourceLocation CoawaitLoc,
1896*67e74705SXin Li                                     SourceLocation ColonLoc,
1897*67e74705SXin Li                                     Stmt *Range, Stmt *Begin, Stmt *End,
1898*67e74705SXin Li                                     Expr *Cond, Expr *Inc,
1899*67e74705SXin Li                                     Stmt *LoopVar,
1900*67e74705SXin Li                                     SourceLocation RParenLoc) {
1901*67e74705SXin Li     // If we've just learned that the range is actually an Objective-C
1902*67e74705SXin Li     // collection, treat this as an Objective-C fast enumeration loop.
1903*67e74705SXin Li     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1904*67e74705SXin Li       if (RangeStmt->isSingleDecl()) {
1905*67e74705SXin Li         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1906*67e74705SXin Li           if (RangeVar->isInvalidDecl())
1907*67e74705SXin Li             return StmtError();
1908*67e74705SXin Li 
1909*67e74705SXin Li           Expr *RangeExpr = RangeVar->getInit();
1910*67e74705SXin Li           if (!RangeExpr->isTypeDependent() &&
1911*67e74705SXin Li               RangeExpr->getType()->isObjCObjectPointerType())
1912*67e74705SXin Li             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1913*67e74705SXin Li                                                         RParenLoc);
1914*67e74705SXin Li         }
1915*67e74705SXin Li       }
1916*67e74705SXin Li     }
1917*67e74705SXin Li 
1918*67e74705SXin Li     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
1919*67e74705SXin Li                                           Range, Begin, End,
1920*67e74705SXin Li                                           Cond, Inc, LoopVar, RParenLoc,
1921*67e74705SXin Li                                           Sema::BFRK_Rebuild);
1922*67e74705SXin Li   }
1923*67e74705SXin Li 
1924*67e74705SXin Li   /// \brief Build a new C++0x range-based for statement.
1925*67e74705SXin Li   ///
1926*67e74705SXin Li   /// By default, performs semantic analysis to build the new statement.
1927*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,NestedNameSpecifierLoc QualifierLoc,DeclarationNameInfo NameInfo,Stmt * Nested)1928*67e74705SXin Li   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1929*67e74705SXin Li                                           bool IsIfExists,
1930*67e74705SXin Li                                           NestedNameSpecifierLoc QualifierLoc,
1931*67e74705SXin Li                                           DeclarationNameInfo NameInfo,
1932*67e74705SXin Li                                           Stmt *Nested) {
1933*67e74705SXin Li     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1934*67e74705SXin Li                                                 QualifierLoc, NameInfo, Nested);
1935*67e74705SXin Li   }
1936*67e74705SXin Li 
1937*67e74705SXin Li   /// \brief Attach body to a C++0x range-based for statement.
1938*67e74705SXin Li   ///
1939*67e74705SXin Li   /// By default, performs semantic analysis to finish the new statement.
1940*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
FinishCXXForRangeStmt(Stmt * ForRange,Stmt * Body)1941*67e74705SXin Li   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1942*67e74705SXin Li     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1943*67e74705SXin Li   }
1944*67e74705SXin Li 
RebuildSEHTryStmt(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)1945*67e74705SXin Li   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1946*67e74705SXin Li                                Stmt *TryBlock, Stmt *Handler) {
1947*67e74705SXin Li     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1948*67e74705SXin Li   }
1949*67e74705SXin Li 
RebuildSEHExceptStmt(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)1950*67e74705SXin Li   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1951*67e74705SXin Li                                   Stmt *Block) {
1952*67e74705SXin Li     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1953*67e74705SXin Li   }
1954*67e74705SXin Li 
RebuildSEHFinallyStmt(SourceLocation Loc,Stmt * Block)1955*67e74705SXin Li   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1956*67e74705SXin Li     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
1957*67e74705SXin Li   }
1958*67e74705SXin Li 
1959*67e74705SXin Li   /// \brief Build a new predefined expression.
1960*67e74705SXin Li   ///
1961*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
1962*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildPredefinedExpr(SourceLocation Loc,PredefinedExpr::IdentType IT)1963*67e74705SXin Li   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
1964*67e74705SXin Li                                    PredefinedExpr::IdentType IT) {
1965*67e74705SXin Li     return getSema().BuildPredefinedExpr(Loc, IT);
1966*67e74705SXin Li   }
1967*67e74705SXin Li 
1968*67e74705SXin Li   /// \brief Build a new expression that references a declaration.
1969*67e74705SXin Li   ///
1970*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
1971*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDeclarationNameExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL)1972*67e74705SXin Li   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1973*67e74705SXin Li                                         LookupResult &R,
1974*67e74705SXin Li                                         bool RequiresADL) {
1975*67e74705SXin Li     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1976*67e74705SXin Li   }
1977*67e74705SXin Li 
1978*67e74705SXin Li 
1979*67e74705SXin Li   /// \brief Build a new expression that references a declaration.
1980*67e74705SXin Li   ///
1981*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
1982*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,ValueDecl * VD,const DeclarationNameInfo & NameInfo,TemplateArgumentListInfo * TemplateArgs)1983*67e74705SXin Li   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1984*67e74705SXin Li                                 ValueDecl *VD,
1985*67e74705SXin Li                                 const DeclarationNameInfo &NameInfo,
1986*67e74705SXin Li                                 TemplateArgumentListInfo *TemplateArgs) {
1987*67e74705SXin Li     CXXScopeSpec SS;
1988*67e74705SXin Li     SS.Adopt(QualifierLoc);
1989*67e74705SXin Li 
1990*67e74705SXin Li     // FIXME: loses template args.
1991*67e74705SXin Li 
1992*67e74705SXin Li     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1993*67e74705SXin Li   }
1994*67e74705SXin Li 
1995*67e74705SXin Li   /// \brief Build a new expression in parentheses.
1996*67e74705SXin Li   ///
1997*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
1998*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildParenExpr(Expr * SubExpr,SourceLocation LParen,SourceLocation RParen)1999*67e74705SXin Li   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2000*67e74705SXin Li                                     SourceLocation RParen) {
2001*67e74705SXin Li     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2002*67e74705SXin Li   }
2003*67e74705SXin Li 
2004*67e74705SXin Li   /// \brief Build a new pseudo-destructor expression.
2005*67e74705SXin Li   ///
2006*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2007*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
2008*67e74705SXin Li   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2009*67e74705SXin Li                                             SourceLocation OperatorLoc,
2010*67e74705SXin Li                                             bool isArrow,
2011*67e74705SXin Li                                             CXXScopeSpec &SS,
2012*67e74705SXin Li                                             TypeSourceInfo *ScopeType,
2013*67e74705SXin Li                                             SourceLocation CCLoc,
2014*67e74705SXin Li                                             SourceLocation TildeLoc,
2015*67e74705SXin Li                                         PseudoDestructorTypeStorage Destroyed);
2016*67e74705SXin Li 
2017*67e74705SXin Li   /// \brief Build a new unary operator expression.
2018*67e74705SXin Li   ///
2019*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2020*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryOperator(SourceLocation OpLoc,UnaryOperatorKind Opc,Expr * SubExpr)2021*67e74705SXin Li   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2022*67e74705SXin Li                                         UnaryOperatorKind Opc,
2023*67e74705SXin Li                                         Expr *SubExpr) {
2024*67e74705SXin Li     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2025*67e74705SXin Li   }
2026*67e74705SXin Li 
2027*67e74705SXin Li   /// \brief Build a new builtin offsetof expression.
2028*67e74705SXin Li   ///
2029*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2030*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOffsetOfExpr(SourceLocation OperatorLoc,TypeSourceInfo * Type,ArrayRef<Sema::OffsetOfComponent> Components,SourceLocation RParenLoc)2031*67e74705SXin Li   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2032*67e74705SXin Li                                  TypeSourceInfo *Type,
2033*67e74705SXin Li                                  ArrayRef<Sema::OffsetOfComponent> Components,
2034*67e74705SXin Li                                  SourceLocation RParenLoc) {
2035*67e74705SXin Li     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2036*67e74705SXin Li                                           RParenLoc);
2037*67e74705SXin Li   }
2038*67e74705SXin Li 
2039*67e74705SXin Li   /// \brief Build a new sizeof, alignof or vec_step expression with a
2040*67e74705SXin Li   /// type argument.
2041*67e74705SXin Li   ///
2042*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2043*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(TypeSourceInfo * TInfo,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)2044*67e74705SXin Li   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2045*67e74705SXin Li                                          SourceLocation OpLoc,
2046*67e74705SXin Li                                          UnaryExprOrTypeTrait ExprKind,
2047*67e74705SXin Li                                          SourceRange R) {
2048*67e74705SXin Li     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2049*67e74705SXin Li   }
2050*67e74705SXin Li 
2051*67e74705SXin Li   /// \brief Build a new sizeof, alignof or vec step expression with an
2052*67e74705SXin Li   /// expression argument.
2053*67e74705SXin Li   ///
2054*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2055*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(Expr * SubExpr,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)2056*67e74705SXin Li   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2057*67e74705SXin Li                                          UnaryExprOrTypeTrait ExprKind,
2058*67e74705SXin Li                                          SourceRange R) {
2059*67e74705SXin Li     ExprResult Result
2060*67e74705SXin Li       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2061*67e74705SXin Li     if (Result.isInvalid())
2062*67e74705SXin Li       return ExprError();
2063*67e74705SXin Li 
2064*67e74705SXin Li     return Result;
2065*67e74705SXin Li   }
2066*67e74705SXin Li 
2067*67e74705SXin Li   /// \brief Build a new array subscript expression.
2068*67e74705SXin Li   ///
2069*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2070*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildArraySubscriptExpr(Expr * LHS,SourceLocation LBracketLoc,Expr * RHS,SourceLocation RBracketLoc)2071*67e74705SXin Li   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2072*67e74705SXin Li                                              SourceLocation LBracketLoc,
2073*67e74705SXin Li                                              Expr *RHS,
2074*67e74705SXin Li                                              SourceLocation RBracketLoc) {
2075*67e74705SXin Li     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2076*67e74705SXin Li                                              LBracketLoc, RHS,
2077*67e74705SXin Li                                              RBracketLoc);
2078*67e74705SXin Li   }
2079*67e74705SXin Li 
2080*67e74705SXin Li   /// \brief Build a new array section expression.
2081*67e74705SXin Li   ///
2082*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2083*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildOMPArraySectionExpr(Expr * Base,SourceLocation LBracketLoc,Expr * LowerBound,SourceLocation ColonLoc,Expr * Length,SourceLocation RBracketLoc)2084*67e74705SXin Li   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2085*67e74705SXin Li                                         Expr *LowerBound,
2086*67e74705SXin Li                                         SourceLocation ColonLoc, Expr *Length,
2087*67e74705SXin Li                                         SourceLocation RBracketLoc) {
2088*67e74705SXin Li     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2089*67e74705SXin Li                                               ColonLoc, Length, RBracketLoc);
2090*67e74705SXin Li   }
2091*67e74705SXin Li 
2092*67e74705SXin Li   /// \brief Build a new call expression.
2093*67e74705SXin Li   ///
2094*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2095*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
2096*67e74705SXin Li   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2097*67e74705SXin Li                                    MultiExprArg Args,
2098*67e74705SXin Li                                    SourceLocation RParenLoc,
2099*67e74705SXin Li                                    Expr *ExecConfig = nullptr) {
2100*67e74705SXin Li     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2101*67e74705SXin Li                                    Args, RParenLoc, ExecConfig);
2102*67e74705SXin Li   }
2103*67e74705SXin Li 
2104*67e74705SXin Li   /// \brief Build a new member access expression.
2105*67e74705SXin Li   ///
2106*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2107*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildMemberExpr(Expr * Base,SourceLocation OpLoc,bool isArrow,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & MemberNameInfo,ValueDecl * Member,NamedDecl * FoundDecl,const TemplateArgumentListInfo * ExplicitTemplateArgs,NamedDecl * FirstQualifierInScope)2108*67e74705SXin Li   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2109*67e74705SXin Li                                bool isArrow,
2110*67e74705SXin Li                                NestedNameSpecifierLoc QualifierLoc,
2111*67e74705SXin Li                                SourceLocation TemplateKWLoc,
2112*67e74705SXin Li                                const DeclarationNameInfo &MemberNameInfo,
2113*67e74705SXin Li                                ValueDecl *Member,
2114*67e74705SXin Li                                NamedDecl *FoundDecl,
2115*67e74705SXin Li                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2116*67e74705SXin Li                                NamedDecl *FirstQualifierInScope) {
2117*67e74705SXin Li     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2118*67e74705SXin Li                                                                       isArrow);
2119*67e74705SXin Li     if (!Member->getDeclName()) {
2120*67e74705SXin Li       // We have a reference to an unnamed field.  This is always the
2121*67e74705SXin Li       // base of an anonymous struct/union member access, i.e. the
2122*67e74705SXin Li       // field is always of record type.
2123*67e74705SXin Li       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
2124*67e74705SXin Li       assert(Member->getType()->isRecordType() &&
2125*67e74705SXin Li              "unnamed member not of record type?");
2126*67e74705SXin Li 
2127*67e74705SXin Li       BaseResult =
2128*67e74705SXin Li         getSema().PerformObjectMemberConversion(BaseResult.get(),
2129*67e74705SXin Li                                                 QualifierLoc.getNestedNameSpecifier(),
2130*67e74705SXin Li                                                 FoundDecl, Member);
2131*67e74705SXin Li       if (BaseResult.isInvalid())
2132*67e74705SXin Li         return ExprError();
2133*67e74705SXin Li       Base = BaseResult.get();
2134*67e74705SXin Li       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
2135*67e74705SXin Li       MemberExpr *ME = new (getSema().Context)
2136*67e74705SXin Li           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
2137*67e74705SXin Li                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
2138*67e74705SXin Li       return ME;
2139*67e74705SXin Li     }
2140*67e74705SXin Li 
2141*67e74705SXin Li     CXXScopeSpec SS;
2142*67e74705SXin Li     SS.Adopt(QualifierLoc);
2143*67e74705SXin Li 
2144*67e74705SXin Li     Base = BaseResult.get();
2145*67e74705SXin Li     QualType BaseType = Base->getType();
2146*67e74705SXin Li 
2147*67e74705SXin Li     // FIXME: this involves duplicating earlier analysis in a lot of
2148*67e74705SXin Li     // cases; we should avoid this when possible.
2149*67e74705SXin Li     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2150*67e74705SXin Li     R.addDecl(FoundDecl);
2151*67e74705SXin Li     R.resolveKind();
2152*67e74705SXin Li 
2153*67e74705SXin Li     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2154*67e74705SXin Li                                               SS, TemplateKWLoc,
2155*67e74705SXin Li                                               FirstQualifierInScope,
2156*67e74705SXin Li                                               R, ExplicitTemplateArgs,
2157*67e74705SXin Li                                               /*S*/nullptr);
2158*67e74705SXin Li   }
2159*67e74705SXin Li 
2160*67e74705SXin Li   /// \brief Build a new binary operator expression.
2161*67e74705SXin Li   ///
2162*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2163*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opc,Expr * LHS,Expr * RHS)2164*67e74705SXin Li   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2165*67e74705SXin Li                                          BinaryOperatorKind Opc,
2166*67e74705SXin Li                                          Expr *LHS, Expr *RHS) {
2167*67e74705SXin Li     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2168*67e74705SXin Li   }
2169*67e74705SXin Li 
2170*67e74705SXin Li   /// \brief Build a new conditional operator expression.
2171*67e74705SXin Li   ///
2172*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2173*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildConditionalOperator(Expr * Cond,SourceLocation QuestionLoc,Expr * LHS,SourceLocation ColonLoc,Expr * RHS)2174*67e74705SXin Li   ExprResult RebuildConditionalOperator(Expr *Cond,
2175*67e74705SXin Li                                         SourceLocation QuestionLoc,
2176*67e74705SXin Li                                         Expr *LHS,
2177*67e74705SXin Li                                         SourceLocation ColonLoc,
2178*67e74705SXin Li                                         Expr *RHS) {
2179*67e74705SXin Li     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2180*67e74705SXin Li                                         LHS, RHS);
2181*67e74705SXin Li   }
2182*67e74705SXin Li 
2183*67e74705SXin Li   /// \brief Build a new C-style cast expression.
2184*67e74705SXin Li   ///
2185*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2186*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCStyleCastExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * SubExpr)2187*67e74705SXin Li   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2188*67e74705SXin Li                                          TypeSourceInfo *TInfo,
2189*67e74705SXin Li                                          SourceLocation RParenLoc,
2190*67e74705SXin Li                                          Expr *SubExpr) {
2191*67e74705SXin Li     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2192*67e74705SXin Li                                          SubExpr);
2193*67e74705SXin Li   }
2194*67e74705SXin Li 
2195*67e74705SXin Li   /// \brief Build a new compound literal expression.
2196*67e74705SXin Li   ///
2197*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2198*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCompoundLiteralExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * Init)2199*67e74705SXin Li   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2200*67e74705SXin Li                                               TypeSourceInfo *TInfo,
2201*67e74705SXin Li                                               SourceLocation RParenLoc,
2202*67e74705SXin Li                                               Expr *Init) {
2203*67e74705SXin Li     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2204*67e74705SXin Li                                               Init);
2205*67e74705SXin Li   }
2206*67e74705SXin Li 
2207*67e74705SXin Li   /// \brief Build a new extended vector element access expression.
2208*67e74705SXin Li   ///
2209*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2210*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildExtVectorElementExpr(Expr * Base,SourceLocation OpLoc,SourceLocation AccessorLoc,IdentifierInfo & Accessor)2211*67e74705SXin Li   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2212*67e74705SXin Li                                                SourceLocation OpLoc,
2213*67e74705SXin Li                                                SourceLocation AccessorLoc,
2214*67e74705SXin Li                                                IdentifierInfo &Accessor) {
2215*67e74705SXin Li 
2216*67e74705SXin Li     CXXScopeSpec SS;
2217*67e74705SXin Li     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2218*67e74705SXin Li     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2219*67e74705SXin Li                                               OpLoc, /*IsArrow*/ false,
2220*67e74705SXin Li                                               SS, SourceLocation(),
2221*67e74705SXin Li                                               /*FirstQualifierInScope*/ nullptr,
2222*67e74705SXin Li                                               NameInfo,
2223*67e74705SXin Li                                               /* TemplateArgs */ nullptr,
2224*67e74705SXin Li                                               /*S*/ nullptr);
2225*67e74705SXin Li   }
2226*67e74705SXin Li 
2227*67e74705SXin Li   /// \brief Build a new initializer list expression.
2228*67e74705SXin Li   ///
2229*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2230*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildInitList(SourceLocation LBraceLoc,MultiExprArg Inits,SourceLocation RBraceLoc,QualType ResultTy)2231*67e74705SXin Li   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2232*67e74705SXin Li                              MultiExprArg Inits,
2233*67e74705SXin Li                              SourceLocation RBraceLoc,
2234*67e74705SXin Li                              QualType ResultTy) {
2235*67e74705SXin Li     ExprResult Result
2236*67e74705SXin Li       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2237*67e74705SXin Li     if (Result.isInvalid() || ResultTy->isDependentType())
2238*67e74705SXin Li       return Result;
2239*67e74705SXin Li 
2240*67e74705SXin Li     // Patch in the result type we were given, which may have been computed
2241*67e74705SXin Li     // when the initial InitListExpr was built.
2242*67e74705SXin Li     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
2243*67e74705SXin Li     ILE->setType(ResultTy);
2244*67e74705SXin Li     return Result;
2245*67e74705SXin Li   }
2246*67e74705SXin Li 
2247*67e74705SXin Li   /// \brief Build a new designated initializer expression.
2248*67e74705SXin Li   ///
2249*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2250*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDesignatedInitExpr(Designation & Desig,MultiExprArg ArrayExprs,SourceLocation EqualOrColonLoc,bool GNUSyntax,Expr * Init)2251*67e74705SXin Li   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2252*67e74705SXin Li                                              MultiExprArg ArrayExprs,
2253*67e74705SXin Li                                              SourceLocation EqualOrColonLoc,
2254*67e74705SXin Li                                              bool GNUSyntax,
2255*67e74705SXin Li                                              Expr *Init) {
2256*67e74705SXin Li     ExprResult Result
2257*67e74705SXin Li       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2258*67e74705SXin Li                                            Init);
2259*67e74705SXin Li     if (Result.isInvalid())
2260*67e74705SXin Li       return ExprError();
2261*67e74705SXin Li 
2262*67e74705SXin Li     return Result;
2263*67e74705SXin Li   }
2264*67e74705SXin Li 
2265*67e74705SXin Li   /// \brief Build a new value-initialized expression.
2266*67e74705SXin Li   ///
2267*67e74705SXin Li   /// By default, builds the implicit value initialization without performing
2268*67e74705SXin Li   /// any semantic analysis. Subclasses may override this routine to provide
2269*67e74705SXin Li   /// different behavior.
RebuildImplicitValueInitExpr(QualType T)2270*67e74705SXin Li   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2271*67e74705SXin Li     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2272*67e74705SXin Li   }
2273*67e74705SXin Li 
2274*67e74705SXin Li   /// \brief Build a new \c va_arg expression.
2275*67e74705SXin Li   ///
2276*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2277*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildVAArgExpr(SourceLocation BuiltinLoc,Expr * SubExpr,TypeSourceInfo * TInfo,SourceLocation RParenLoc)2278*67e74705SXin Li   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2279*67e74705SXin Li                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2280*67e74705SXin Li                                     SourceLocation RParenLoc) {
2281*67e74705SXin Li     return getSema().BuildVAArgExpr(BuiltinLoc,
2282*67e74705SXin Li                                     SubExpr, TInfo,
2283*67e74705SXin Li                                     RParenLoc);
2284*67e74705SXin Li   }
2285*67e74705SXin Li 
2286*67e74705SXin Li   /// \brief Build a new expression list in parentheses.
2287*67e74705SXin Li   ///
2288*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2289*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildParenListExpr(SourceLocation LParenLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2290*67e74705SXin Li   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2291*67e74705SXin Li                                   MultiExprArg SubExprs,
2292*67e74705SXin Li                                   SourceLocation RParenLoc) {
2293*67e74705SXin Li     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2294*67e74705SXin Li   }
2295*67e74705SXin Li 
2296*67e74705SXin Li   /// \brief Build a new address-of-label expression.
2297*67e74705SXin Li   ///
2298*67e74705SXin Li   /// By default, performs semantic analysis, using the name of the label
2299*67e74705SXin Li   /// rather than attempting to map the label statement itself.
2300*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,SourceLocation LabelLoc,LabelDecl * Label)2301*67e74705SXin Li   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2302*67e74705SXin Li                                   SourceLocation LabelLoc, LabelDecl *Label) {
2303*67e74705SXin Li     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2304*67e74705SXin Li   }
2305*67e74705SXin Li 
2306*67e74705SXin Li   /// \brief Build a new GNU statement expression.
2307*67e74705SXin Li   ///
2308*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2309*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildStmtExpr(SourceLocation LParenLoc,Stmt * SubStmt,SourceLocation RParenLoc)2310*67e74705SXin Li   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2311*67e74705SXin Li                                    Stmt *SubStmt,
2312*67e74705SXin Li                                    SourceLocation RParenLoc) {
2313*67e74705SXin Li     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2314*67e74705SXin Li   }
2315*67e74705SXin Li 
2316*67e74705SXin Li   /// \brief Build a new __builtin_choose_expr expression.
2317*67e74705SXin Li   ///
2318*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2319*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildChooseExpr(SourceLocation BuiltinLoc,Expr * Cond,Expr * LHS,Expr * RHS,SourceLocation RParenLoc)2320*67e74705SXin Li   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2321*67e74705SXin Li                                      Expr *Cond, Expr *LHS, Expr *RHS,
2322*67e74705SXin Li                                      SourceLocation RParenLoc) {
2323*67e74705SXin Li     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2324*67e74705SXin Li                                    Cond, LHS, RHS,
2325*67e74705SXin Li                                    RParenLoc);
2326*67e74705SXin Li   }
2327*67e74705SXin Li 
2328*67e74705SXin Li   /// \brief Build a new generic selection expression.
2329*67e74705SXin Li   ///
2330*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2331*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildGenericSelectionExpr(SourceLocation KeyLoc,SourceLocation DefaultLoc,SourceLocation RParenLoc,Expr * ControllingExpr,ArrayRef<TypeSourceInfo * > Types,ArrayRef<Expr * > Exprs)2332*67e74705SXin Li   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2333*67e74705SXin Li                                          SourceLocation DefaultLoc,
2334*67e74705SXin Li                                          SourceLocation RParenLoc,
2335*67e74705SXin Li                                          Expr *ControllingExpr,
2336*67e74705SXin Li                                          ArrayRef<TypeSourceInfo *> Types,
2337*67e74705SXin Li                                          ArrayRef<Expr *> Exprs) {
2338*67e74705SXin Li     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2339*67e74705SXin Li                                                 ControllingExpr, Types, Exprs);
2340*67e74705SXin Li   }
2341*67e74705SXin Li 
2342*67e74705SXin Li   /// \brief Build a new overloaded operator call expression.
2343*67e74705SXin Li   ///
2344*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2345*67e74705SXin Li   /// The semantic analysis provides the behavior of template instantiation,
2346*67e74705SXin Li   /// copying with transformations that turn what looks like an overloaded
2347*67e74705SXin Li   /// operator call into a use of a builtin operator, performing
2348*67e74705SXin Li   /// argument-dependent lookup, etc. Subclasses may override this routine to
2349*67e74705SXin Li   /// provide different behavior.
2350*67e74705SXin Li   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2351*67e74705SXin Li                                               SourceLocation OpLoc,
2352*67e74705SXin Li                                               Expr *Callee,
2353*67e74705SXin Li                                               Expr *First,
2354*67e74705SXin Li                                               Expr *Second);
2355*67e74705SXin Li 
2356*67e74705SXin Li   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2357*67e74705SXin Li   /// reinterpret_cast.
2358*67e74705SXin Li   ///
2359*67e74705SXin Li   /// By default, this routine dispatches to one of the more-specific routines
2360*67e74705SXin Li   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2361*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNamedCastExpr(SourceLocation OpLoc,Stmt::StmtClass Class,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2362*67e74705SXin Li   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2363*67e74705SXin Li                                            Stmt::StmtClass Class,
2364*67e74705SXin Li                                            SourceLocation LAngleLoc,
2365*67e74705SXin Li                                            TypeSourceInfo *TInfo,
2366*67e74705SXin Li                                            SourceLocation RAngleLoc,
2367*67e74705SXin Li                                            SourceLocation LParenLoc,
2368*67e74705SXin Li                                            Expr *SubExpr,
2369*67e74705SXin Li                                            SourceLocation RParenLoc) {
2370*67e74705SXin Li     switch (Class) {
2371*67e74705SXin Li     case Stmt::CXXStaticCastExprClass:
2372*67e74705SXin Li       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2373*67e74705SXin Li                                                    RAngleLoc, LParenLoc,
2374*67e74705SXin Li                                                    SubExpr, RParenLoc);
2375*67e74705SXin Li 
2376*67e74705SXin Li     case Stmt::CXXDynamicCastExprClass:
2377*67e74705SXin Li       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2378*67e74705SXin Li                                                     RAngleLoc, LParenLoc,
2379*67e74705SXin Li                                                     SubExpr, RParenLoc);
2380*67e74705SXin Li 
2381*67e74705SXin Li     case Stmt::CXXReinterpretCastExprClass:
2382*67e74705SXin Li       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2383*67e74705SXin Li                                                         RAngleLoc, LParenLoc,
2384*67e74705SXin Li                                                         SubExpr,
2385*67e74705SXin Li                                                         RParenLoc);
2386*67e74705SXin Li 
2387*67e74705SXin Li     case Stmt::CXXConstCastExprClass:
2388*67e74705SXin Li       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2389*67e74705SXin Li                                                    RAngleLoc, LParenLoc,
2390*67e74705SXin Li                                                    SubExpr, RParenLoc);
2391*67e74705SXin Li 
2392*67e74705SXin Li     default:
2393*67e74705SXin Li       llvm_unreachable("Invalid C++ named cast");
2394*67e74705SXin Li     }
2395*67e74705SXin Li   }
2396*67e74705SXin Li 
2397*67e74705SXin Li   /// \brief Build a new C++ static_cast expression.
2398*67e74705SXin Li   ///
2399*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2400*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXStaticCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2401*67e74705SXin Li   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2402*67e74705SXin Li                                             SourceLocation LAngleLoc,
2403*67e74705SXin Li                                             TypeSourceInfo *TInfo,
2404*67e74705SXin Li                                             SourceLocation RAngleLoc,
2405*67e74705SXin Li                                             SourceLocation LParenLoc,
2406*67e74705SXin Li                                             Expr *SubExpr,
2407*67e74705SXin Li                                             SourceLocation RParenLoc) {
2408*67e74705SXin Li     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2409*67e74705SXin Li                                        TInfo, SubExpr,
2410*67e74705SXin Li                                        SourceRange(LAngleLoc, RAngleLoc),
2411*67e74705SXin Li                                        SourceRange(LParenLoc, RParenLoc));
2412*67e74705SXin Li   }
2413*67e74705SXin Li 
2414*67e74705SXin Li   /// \brief Build a new C++ dynamic_cast expression.
2415*67e74705SXin Li   ///
2416*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2417*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDynamicCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2418*67e74705SXin Li   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2419*67e74705SXin Li                                              SourceLocation LAngleLoc,
2420*67e74705SXin Li                                              TypeSourceInfo *TInfo,
2421*67e74705SXin Li                                              SourceLocation RAngleLoc,
2422*67e74705SXin Li                                              SourceLocation LParenLoc,
2423*67e74705SXin Li                                              Expr *SubExpr,
2424*67e74705SXin Li                                              SourceLocation RParenLoc) {
2425*67e74705SXin Li     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2426*67e74705SXin Li                                        TInfo, SubExpr,
2427*67e74705SXin Li                                        SourceRange(LAngleLoc, RAngleLoc),
2428*67e74705SXin Li                                        SourceRange(LParenLoc, RParenLoc));
2429*67e74705SXin Li   }
2430*67e74705SXin Li 
2431*67e74705SXin Li   /// \brief Build a new C++ reinterpret_cast expression.
2432*67e74705SXin Li   ///
2433*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2434*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2435*67e74705SXin Li   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2436*67e74705SXin Li                                                  SourceLocation LAngleLoc,
2437*67e74705SXin Li                                                  TypeSourceInfo *TInfo,
2438*67e74705SXin Li                                                  SourceLocation RAngleLoc,
2439*67e74705SXin Li                                                  SourceLocation LParenLoc,
2440*67e74705SXin Li                                                  Expr *SubExpr,
2441*67e74705SXin Li                                                  SourceLocation RParenLoc) {
2442*67e74705SXin Li     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2443*67e74705SXin Li                                        TInfo, SubExpr,
2444*67e74705SXin Li                                        SourceRange(LAngleLoc, RAngleLoc),
2445*67e74705SXin Li                                        SourceRange(LParenLoc, RParenLoc));
2446*67e74705SXin Li   }
2447*67e74705SXin Li 
2448*67e74705SXin Li   /// \brief Build a new C++ const_cast expression.
2449*67e74705SXin Li   ///
2450*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2451*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2452*67e74705SXin Li   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2453*67e74705SXin Li                                            SourceLocation LAngleLoc,
2454*67e74705SXin Li                                            TypeSourceInfo *TInfo,
2455*67e74705SXin Li                                            SourceLocation RAngleLoc,
2456*67e74705SXin Li                                            SourceLocation LParenLoc,
2457*67e74705SXin Li                                            Expr *SubExpr,
2458*67e74705SXin Li                                            SourceLocation RParenLoc) {
2459*67e74705SXin Li     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2460*67e74705SXin Li                                        TInfo, SubExpr,
2461*67e74705SXin Li                                        SourceRange(LAngleLoc, RAngleLoc),
2462*67e74705SXin Li                                        SourceRange(LParenLoc, RParenLoc));
2463*67e74705SXin Li   }
2464*67e74705SXin Li 
2465*67e74705SXin Li   /// \brief Build a new C++ functional-style cast expression.
2466*67e74705SXin Li   ///
2467*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2468*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXFunctionalCastExpr(TypeSourceInfo * TInfo,SourceLocation LParenLoc,Expr * Sub,SourceLocation RParenLoc)2469*67e74705SXin Li   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2470*67e74705SXin Li                                           SourceLocation LParenLoc,
2471*67e74705SXin Li                                           Expr *Sub,
2472*67e74705SXin Li                                           SourceLocation RParenLoc) {
2473*67e74705SXin Li     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2474*67e74705SXin Li                                                MultiExprArg(&Sub, 1),
2475*67e74705SXin Li                                                RParenLoc);
2476*67e74705SXin Li   }
2477*67e74705SXin Li 
2478*67e74705SXin Li   /// \brief Build a new C++ typeid(type) expression.
2479*67e74705SXin Li   ///
2480*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2481*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2482*67e74705SXin Li   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2483*67e74705SXin Li                                         SourceLocation TypeidLoc,
2484*67e74705SXin Li                                         TypeSourceInfo *Operand,
2485*67e74705SXin Li                                         SourceLocation RParenLoc) {
2486*67e74705SXin Li     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2487*67e74705SXin Li                                     RParenLoc);
2488*67e74705SXin Li   }
2489*67e74705SXin Li 
2490*67e74705SXin Li 
2491*67e74705SXin Li   /// \brief Build a new C++ typeid(expr) expression.
2492*67e74705SXin Li   ///
2493*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2494*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)2495*67e74705SXin Li   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2496*67e74705SXin Li                                         SourceLocation TypeidLoc,
2497*67e74705SXin Li                                         Expr *Operand,
2498*67e74705SXin Li                                         SourceLocation RParenLoc) {
2499*67e74705SXin Li     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2500*67e74705SXin Li                                     RParenLoc);
2501*67e74705SXin Li   }
2502*67e74705SXin Li 
2503*67e74705SXin Li   /// \brief Build a new C++ __uuidof(type) expression.
2504*67e74705SXin Li   ///
2505*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2506*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2507*67e74705SXin Li   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2508*67e74705SXin Li                                         SourceLocation TypeidLoc,
2509*67e74705SXin Li                                         TypeSourceInfo *Operand,
2510*67e74705SXin Li                                         SourceLocation RParenLoc) {
2511*67e74705SXin Li     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2512*67e74705SXin Li                                     RParenLoc);
2513*67e74705SXin Li   }
2514*67e74705SXin Li 
2515*67e74705SXin Li   /// \brief Build a new C++ __uuidof(expr) expression.
2516*67e74705SXin Li   ///
2517*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2518*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)2519*67e74705SXin Li   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2520*67e74705SXin Li                                         SourceLocation TypeidLoc,
2521*67e74705SXin Li                                         Expr *Operand,
2522*67e74705SXin Li                                         SourceLocation RParenLoc) {
2523*67e74705SXin Li     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2524*67e74705SXin Li                                     RParenLoc);
2525*67e74705SXin Li   }
2526*67e74705SXin Li 
2527*67e74705SXin Li   /// \brief Build a new C++ "this" expression.
2528*67e74705SXin Li   ///
2529*67e74705SXin Li   /// By default, builds a new "this" expression without performing any
2530*67e74705SXin Li   /// semantic analysis. Subclasses may override this routine to provide
2531*67e74705SXin Li   /// different behavior.
RebuildCXXThisExpr(SourceLocation ThisLoc,QualType ThisType,bool isImplicit)2532*67e74705SXin Li   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2533*67e74705SXin Li                                 QualType ThisType,
2534*67e74705SXin Li                                 bool isImplicit) {
2535*67e74705SXin Li     getSema().CheckCXXThisCapture(ThisLoc);
2536*67e74705SXin Li     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2537*67e74705SXin Li   }
2538*67e74705SXin Li 
2539*67e74705SXin Li   /// \brief Build a new C++ throw expression.
2540*67e74705SXin Li   ///
2541*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2542*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXThrowExpr(SourceLocation ThrowLoc,Expr * Sub,bool IsThrownVariableInScope)2543*67e74705SXin Li   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2544*67e74705SXin Li                                  bool IsThrownVariableInScope) {
2545*67e74705SXin Li     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2546*67e74705SXin Li   }
2547*67e74705SXin Li 
2548*67e74705SXin Li   /// \brief Build a new C++ default-argument expression.
2549*67e74705SXin Li   ///
2550*67e74705SXin Li   /// By default, builds a new default-argument expression, which does not
2551*67e74705SXin Li   /// require any semantic analysis. Subclasses may override this routine to
2552*67e74705SXin Li   /// provide different behavior.
RebuildCXXDefaultArgExpr(SourceLocation Loc,ParmVarDecl * Param)2553*67e74705SXin Li   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2554*67e74705SXin Li                                             ParmVarDecl *Param) {
2555*67e74705SXin Li     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2556*67e74705SXin Li   }
2557*67e74705SXin Li 
2558*67e74705SXin Li   /// \brief Build a new C++11 default-initialization expression.
2559*67e74705SXin Li   ///
2560*67e74705SXin Li   /// By default, builds a new default field initialization expression, which
2561*67e74705SXin Li   /// does not require any semantic analysis. Subclasses may override this
2562*67e74705SXin Li   /// routine to provide different behavior.
RebuildCXXDefaultInitExpr(SourceLocation Loc,FieldDecl * Field)2563*67e74705SXin Li   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2564*67e74705SXin Li                                        FieldDecl *Field) {
2565*67e74705SXin Li     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2566*67e74705SXin Li   }
2567*67e74705SXin Li 
2568*67e74705SXin Li   /// \brief Build a new C++ zero-initialization expression.
2569*67e74705SXin Li   ///
2570*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2571*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXScalarValueInitExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,SourceLocation RParenLoc)2572*67e74705SXin Li   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2573*67e74705SXin Li                                            SourceLocation LParenLoc,
2574*67e74705SXin Li                                            SourceLocation RParenLoc) {
2575*67e74705SXin Li     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2576*67e74705SXin Li                                                None, RParenLoc);
2577*67e74705SXin Li   }
2578*67e74705SXin Li 
2579*67e74705SXin Li   /// \brief Build a new C++ "new" expression.
2580*67e74705SXin Li   ///
2581*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2582*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNewExpr(SourceLocation StartLoc,bool UseGlobal,SourceLocation PlacementLParen,MultiExprArg PlacementArgs,SourceLocation PlacementRParen,SourceRange TypeIdParens,QualType AllocatedType,TypeSourceInfo * AllocatedTypeInfo,Expr * ArraySize,SourceRange DirectInitRange,Expr * Initializer)2583*67e74705SXin Li   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2584*67e74705SXin Li                                bool UseGlobal,
2585*67e74705SXin Li                                SourceLocation PlacementLParen,
2586*67e74705SXin Li                                MultiExprArg PlacementArgs,
2587*67e74705SXin Li                                SourceLocation PlacementRParen,
2588*67e74705SXin Li                                SourceRange TypeIdParens,
2589*67e74705SXin Li                                QualType AllocatedType,
2590*67e74705SXin Li                                TypeSourceInfo *AllocatedTypeInfo,
2591*67e74705SXin Li                                Expr *ArraySize,
2592*67e74705SXin Li                                SourceRange DirectInitRange,
2593*67e74705SXin Li                                Expr *Initializer) {
2594*67e74705SXin Li     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2595*67e74705SXin Li                                  PlacementLParen,
2596*67e74705SXin Li                                  PlacementArgs,
2597*67e74705SXin Li                                  PlacementRParen,
2598*67e74705SXin Li                                  TypeIdParens,
2599*67e74705SXin Li                                  AllocatedType,
2600*67e74705SXin Li                                  AllocatedTypeInfo,
2601*67e74705SXin Li                                  ArraySize,
2602*67e74705SXin Li                                  DirectInitRange,
2603*67e74705SXin Li                                  Initializer);
2604*67e74705SXin Li   }
2605*67e74705SXin Li 
2606*67e74705SXin Li   /// \brief Build a new C++ "delete" expression.
2607*67e74705SXin Li   ///
2608*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2609*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDeleteExpr(SourceLocation StartLoc,bool IsGlobalDelete,bool IsArrayForm,Expr * Operand)2610*67e74705SXin Li   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2611*67e74705SXin Li                                         bool IsGlobalDelete,
2612*67e74705SXin Li                                         bool IsArrayForm,
2613*67e74705SXin Li                                         Expr *Operand) {
2614*67e74705SXin Li     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2615*67e74705SXin Li                                     Operand);
2616*67e74705SXin Li   }
2617*67e74705SXin Li 
2618*67e74705SXin Li   /// \brief Build a new type trait expression.
2619*67e74705SXin Li   ///
2620*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2621*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildTypeTrait(TypeTrait Trait,SourceLocation StartLoc,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc)2622*67e74705SXin Li   ExprResult RebuildTypeTrait(TypeTrait Trait,
2623*67e74705SXin Li                               SourceLocation StartLoc,
2624*67e74705SXin Li                               ArrayRef<TypeSourceInfo *> Args,
2625*67e74705SXin Li                               SourceLocation RParenLoc) {
2626*67e74705SXin Li     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2627*67e74705SXin Li   }
2628*67e74705SXin Li 
2629*67e74705SXin Li   /// \brief Build a new array type trait expression.
2630*67e74705SXin Li   ///
2631*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2632*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildArrayTypeTrait(ArrayTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * TSInfo,Expr * DimExpr,SourceLocation RParenLoc)2633*67e74705SXin Li   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2634*67e74705SXin Li                                    SourceLocation StartLoc,
2635*67e74705SXin Li                                    TypeSourceInfo *TSInfo,
2636*67e74705SXin Li                                    Expr *DimExpr,
2637*67e74705SXin Li                                    SourceLocation RParenLoc) {
2638*67e74705SXin Li     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2639*67e74705SXin Li   }
2640*67e74705SXin Li 
2641*67e74705SXin Li   /// \brief Build a new expression trait expression.
2642*67e74705SXin Li   ///
2643*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2644*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildExpressionTrait(ExpressionTrait Trait,SourceLocation StartLoc,Expr * Queried,SourceLocation RParenLoc)2645*67e74705SXin Li   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2646*67e74705SXin Li                                    SourceLocation StartLoc,
2647*67e74705SXin Li                                    Expr *Queried,
2648*67e74705SXin Li                                    SourceLocation RParenLoc) {
2649*67e74705SXin Li     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2650*67e74705SXin Li   }
2651*67e74705SXin Li 
2652*67e74705SXin Li   /// \brief Build a new (previously unresolved) declaration reference
2653*67e74705SXin Li   /// expression.
2654*67e74705SXin Li   ///
2655*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2656*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildDependentScopeDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)2657*67e74705SXin Li   ExprResult RebuildDependentScopeDeclRefExpr(
2658*67e74705SXin Li                                           NestedNameSpecifierLoc QualifierLoc,
2659*67e74705SXin Li                                           SourceLocation TemplateKWLoc,
2660*67e74705SXin Li                                        const DeclarationNameInfo &NameInfo,
2661*67e74705SXin Li                               const TemplateArgumentListInfo *TemplateArgs,
2662*67e74705SXin Li                                           bool IsAddressOfOperand,
2663*67e74705SXin Li                                           TypeSourceInfo **RecoveryTSI) {
2664*67e74705SXin Li     CXXScopeSpec SS;
2665*67e74705SXin Li     SS.Adopt(QualifierLoc);
2666*67e74705SXin Li 
2667*67e74705SXin Li     if (TemplateArgs || TemplateKWLoc.isValid())
2668*67e74705SXin Li       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2669*67e74705SXin Li                                                     TemplateArgs);
2670*67e74705SXin Li 
2671*67e74705SXin Li     return getSema().BuildQualifiedDeclarationNameExpr(
2672*67e74705SXin Li         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2673*67e74705SXin Li   }
2674*67e74705SXin Li 
2675*67e74705SXin Li   /// \brief Build a new template-id expression.
2676*67e74705SXin Li   ///
2677*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2678*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildTemplateIdExpr(const CXXScopeSpec & SS,SourceLocation TemplateKWLoc,LookupResult & R,bool RequiresADL,const TemplateArgumentListInfo * TemplateArgs)2679*67e74705SXin Li   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2680*67e74705SXin Li                                    SourceLocation TemplateKWLoc,
2681*67e74705SXin Li                                    LookupResult &R,
2682*67e74705SXin Li                                    bool RequiresADL,
2683*67e74705SXin Li                               const TemplateArgumentListInfo *TemplateArgs) {
2684*67e74705SXin Li     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2685*67e74705SXin Li                                          TemplateArgs);
2686*67e74705SXin Li   }
2687*67e74705SXin Li 
2688*67e74705SXin Li   /// \brief Build a new object-construction expression.
2689*67e74705SXin Li   ///
2690*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2691*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstructExpr(QualType T,SourceLocation Loc,CXXConstructorDecl * Constructor,bool IsElidable,MultiExprArg Args,bool HadMultipleCandidates,bool ListInitialization,bool StdInitListInitialization,bool RequiresZeroInit,CXXConstructExpr::ConstructionKind ConstructKind,SourceRange ParenRange)2692*67e74705SXin Li   ExprResult RebuildCXXConstructExpr(QualType T,
2693*67e74705SXin Li                                      SourceLocation Loc,
2694*67e74705SXin Li                                      CXXConstructorDecl *Constructor,
2695*67e74705SXin Li                                      bool IsElidable,
2696*67e74705SXin Li                                      MultiExprArg Args,
2697*67e74705SXin Li                                      bool HadMultipleCandidates,
2698*67e74705SXin Li                                      bool ListInitialization,
2699*67e74705SXin Li                                      bool StdInitListInitialization,
2700*67e74705SXin Li                                      bool RequiresZeroInit,
2701*67e74705SXin Li                              CXXConstructExpr::ConstructionKind ConstructKind,
2702*67e74705SXin Li                                      SourceRange ParenRange) {
2703*67e74705SXin Li     SmallVector<Expr*, 8> ConvertedArgs;
2704*67e74705SXin Li     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2705*67e74705SXin Li                                           ConvertedArgs))
2706*67e74705SXin Li       return ExprError();
2707*67e74705SXin Li 
2708*67e74705SXin Li     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2709*67e74705SXin Li                                            IsElidable,
2710*67e74705SXin Li                                            ConvertedArgs,
2711*67e74705SXin Li                                            HadMultipleCandidates,
2712*67e74705SXin Li                                            ListInitialization,
2713*67e74705SXin Li                                            StdInitListInitialization,
2714*67e74705SXin Li                                            RequiresZeroInit, ConstructKind,
2715*67e74705SXin Li                                            ParenRange);
2716*67e74705SXin Li   }
2717*67e74705SXin Li 
2718*67e74705SXin Li   /// \brief Build a new implicit construction via inherited constructor
2719*67e74705SXin Li   /// expression.
RebuildCXXInheritedCtorInitExpr(QualType T,SourceLocation Loc,CXXConstructorDecl * Constructor,bool ConstructsVBase,bool InheritedFromVBase)2720*67e74705SXin Li   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2721*67e74705SXin Li                                              CXXConstructorDecl *Constructor,
2722*67e74705SXin Li                                              bool ConstructsVBase,
2723*67e74705SXin Li                                              bool InheritedFromVBase) {
2724*67e74705SXin Li     return new (getSema().Context) CXXInheritedCtorInitExpr(
2725*67e74705SXin Li         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2726*67e74705SXin Li   }
2727*67e74705SXin Li 
2728*67e74705SXin Li   /// \brief Build a new object-construction expression.
2729*67e74705SXin Li   ///
2730*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2731*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXTemporaryObjectExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2732*67e74705SXin Li   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2733*67e74705SXin Li                                            SourceLocation LParenLoc,
2734*67e74705SXin Li                                            MultiExprArg Args,
2735*67e74705SXin Li                                            SourceLocation RParenLoc) {
2736*67e74705SXin Li     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2737*67e74705SXin Li                                                LParenLoc,
2738*67e74705SXin Li                                                Args,
2739*67e74705SXin Li                                                RParenLoc);
2740*67e74705SXin Li   }
2741*67e74705SXin Li 
2742*67e74705SXin Li   /// \brief Build a new object-construction expression.
2743*67e74705SXin Li   ///
2744*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2745*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2746*67e74705SXin Li   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2747*67e74705SXin Li                                                SourceLocation LParenLoc,
2748*67e74705SXin Li                                                MultiExprArg Args,
2749*67e74705SXin Li                                                SourceLocation RParenLoc) {
2750*67e74705SXin Li     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2751*67e74705SXin Li                                                LParenLoc,
2752*67e74705SXin Li                                                Args,
2753*67e74705SXin Li                                                RParenLoc);
2754*67e74705SXin Li   }
2755*67e74705SXin Li 
2756*67e74705SXin Li   /// \brief Build a new member reference expression.
2757*67e74705SXin Li   ///
2758*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2759*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXDependentScopeMemberExpr(Expr * BaseE,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,NamedDecl * FirstQualifierInScope,const DeclarationNameInfo & MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs)2760*67e74705SXin Li   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2761*67e74705SXin Li                                                 QualType BaseType,
2762*67e74705SXin Li                                                 bool IsArrow,
2763*67e74705SXin Li                                                 SourceLocation OperatorLoc,
2764*67e74705SXin Li                                           NestedNameSpecifierLoc QualifierLoc,
2765*67e74705SXin Li                                                 SourceLocation TemplateKWLoc,
2766*67e74705SXin Li                                             NamedDecl *FirstQualifierInScope,
2767*67e74705SXin Li                                    const DeclarationNameInfo &MemberNameInfo,
2768*67e74705SXin Li                               const TemplateArgumentListInfo *TemplateArgs) {
2769*67e74705SXin Li     CXXScopeSpec SS;
2770*67e74705SXin Li     SS.Adopt(QualifierLoc);
2771*67e74705SXin Li 
2772*67e74705SXin Li     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2773*67e74705SXin Li                                             OperatorLoc, IsArrow,
2774*67e74705SXin Li                                             SS, TemplateKWLoc,
2775*67e74705SXin Li                                             FirstQualifierInScope,
2776*67e74705SXin Li                                             MemberNameInfo,
2777*67e74705SXin Li                                             TemplateArgs, /*S*/nullptr);
2778*67e74705SXin Li   }
2779*67e74705SXin Li 
2780*67e74705SXin Li   /// \brief Build a new member reference expression.
2781*67e74705SXin Li   ///
2782*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2783*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildUnresolvedMemberExpr(Expr * BaseE,QualType BaseType,SourceLocation OperatorLoc,bool IsArrow,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,NamedDecl * FirstQualifierInScope,LookupResult & R,const TemplateArgumentListInfo * TemplateArgs)2784*67e74705SXin Li   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2785*67e74705SXin Li                                          SourceLocation OperatorLoc,
2786*67e74705SXin Li                                          bool IsArrow,
2787*67e74705SXin Li                                          NestedNameSpecifierLoc QualifierLoc,
2788*67e74705SXin Li                                          SourceLocation TemplateKWLoc,
2789*67e74705SXin Li                                          NamedDecl *FirstQualifierInScope,
2790*67e74705SXin Li                                          LookupResult &R,
2791*67e74705SXin Li                                 const TemplateArgumentListInfo *TemplateArgs) {
2792*67e74705SXin Li     CXXScopeSpec SS;
2793*67e74705SXin Li     SS.Adopt(QualifierLoc);
2794*67e74705SXin Li 
2795*67e74705SXin Li     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2796*67e74705SXin Li                                             OperatorLoc, IsArrow,
2797*67e74705SXin Li                                             SS, TemplateKWLoc,
2798*67e74705SXin Li                                             FirstQualifierInScope,
2799*67e74705SXin Li                                             R, TemplateArgs, /*S*/nullptr);
2800*67e74705SXin Li   }
2801*67e74705SXin Li 
2802*67e74705SXin Li   /// \brief Build a new noexcept expression.
2803*67e74705SXin Li   ///
2804*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2805*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildCXXNoexceptExpr(SourceRange Range,Expr * Arg)2806*67e74705SXin Li   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2807*67e74705SXin Li     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2808*67e74705SXin Li   }
2809*67e74705SXin Li 
2810*67e74705SXin Li   /// \brief Build a new expression to compute the length of a parameter pack.
RebuildSizeOfPackExpr(SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,Optional<unsigned> Length,ArrayRef<TemplateArgument> PartialArgs)2811*67e74705SXin Li   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2812*67e74705SXin Li                                    NamedDecl *Pack,
2813*67e74705SXin Li                                    SourceLocation PackLoc,
2814*67e74705SXin Li                                    SourceLocation RParenLoc,
2815*67e74705SXin Li                                    Optional<unsigned> Length,
2816*67e74705SXin Li                                    ArrayRef<TemplateArgument> PartialArgs) {
2817*67e74705SXin Li     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2818*67e74705SXin Li                                   RParenLoc, Length, PartialArgs);
2819*67e74705SXin Li   }
2820*67e74705SXin Li 
2821*67e74705SXin Li   /// \brief Build a new Objective-C boxed expression.
2822*67e74705SXin Li   ///
2823*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2824*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCBoxedExpr(SourceRange SR,Expr * ValueExpr)2825*67e74705SXin Li   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2826*67e74705SXin Li     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2827*67e74705SXin Li   }
2828*67e74705SXin Li 
2829*67e74705SXin Li   /// \brief Build a new Objective-C array literal.
2830*67e74705SXin Li   ///
2831*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2832*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCArrayLiteral(SourceRange Range,Expr ** Elements,unsigned NumElements)2833*67e74705SXin Li   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2834*67e74705SXin Li                                      Expr **Elements, unsigned NumElements) {
2835*67e74705SXin Li     return getSema().BuildObjCArrayLiteral(Range,
2836*67e74705SXin Li                                            MultiExprArg(Elements, NumElements));
2837*67e74705SXin Li   }
2838*67e74705SXin Li 
RebuildObjCSubscriptRefExpr(SourceLocation RB,Expr * Base,Expr * Key,ObjCMethodDecl * getterMethod,ObjCMethodDecl * setterMethod)2839*67e74705SXin Li   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2840*67e74705SXin Li                                          Expr *Base, Expr *Key,
2841*67e74705SXin Li                                          ObjCMethodDecl *getterMethod,
2842*67e74705SXin Li                                          ObjCMethodDecl *setterMethod) {
2843*67e74705SXin Li     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2844*67e74705SXin Li                                                    getterMethod, setterMethod);
2845*67e74705SXin Li   }
2846*67e74705SXin Li 
2847*67e74705SXin Li   /// \brief Build a new Objective-C dictionary literal.
2848*67e74705SXin Li   ///
2849*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2850*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCDictionaryLiteral(SourceRange Range,MutableArrayRef<ObjCDictionaryElement> Elements)2851*67e74705SXin Li   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2852*67e74705SXin Li                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2853*67e74705SXin Li     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2854*67e74705SXin Li   }
2855*67e74705SXin Li 
2856*67e74705SXin Li   /// \brief Build a new Objective-C \@encode expression.
2857*67e74705SXin Li   ///
2858*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2859*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCEncodeExpr(SourceLocation AtLoc,TypeSourceInfo * EncodeTypeInfo,SourceLocation RParenLoc)2860*67e74705SXin Li   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2861*67e74705SXin Li                                          TypeSourceInfo *EncodeTypeInfo,
2862*67e74705SXin Li                                          SourceLocation RParenLoc) {
2863*67e74705SXin Li     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2864*67e74705SXin Li   }
2865*67e74705SXin Li 
2866*67e74705SXin Li   /// \brief Build a new Objective-C class message.
RebuildObjCMessageExpr(TypeSourceInfo * ReceiverTypeInfo,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2867*67e74705SXin Li   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2868*67e74705SXin Li                                           Selector Sel,
2869*67e74705SXin Li                                           ArrayRef<SourceLocation> SelectorLocs,
2870*67e74705SXin Li                                           ObjCMethodDecl *Method,
2871*67e74705SXin Li                                           SourceLocation LBracLoc,
2872*67e74705SXin Li                                           MultiExprArg Args,
2873*67e74705SXin Li                                           SourceLocation RBracLoc) {
2874*67e74705SXin Li     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2875*67e74705SXin Li                                      ReceiverTypeInfo->getType(),
2876*67e74705SXin Li                                      /*SuperLoc=*/SourceLocation(),
2877*67e74705SXin Li                                      Sel, Method, LBracLoc, SelectorLocs,
2878*67e74705SXin Li                                      RBracLoc, Args);
2879*67e74705SXin Li   }
2880*67e74705SXin Li 
2881*67e74705SXin Li   /// \brief Build a new Objective-C instance message.
RebuildObjCMessageExpr(Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2882*67e74705SXin Li   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2883*67e74705SXin Li                                           Selector Sel,
2884*67e74705SXin Li                                           ArrayRef<SourceLocation> SelectorLocs,
2885*67e74705SXin Li                                           ObjCMethodDecl *Method,
2886*67e74705SXin Li                                           SourceLocation LBracLoc,
2887*67e74705SXin Li                                           MultiExprArg Args,
2888*67e74705SXin Li                                           SourceLocation RBracLoc) {
2889*67e74705SXin Li     return SemaRef.BuildInstanceMessage(Receiver,
2890*67e74705SXin Li                                         Receiver->getType(),
2891*67e74705SXin Li                                         /*SuperLoc=*/SourceLocation(),
2892*67e74705SXin Li                                         Sel, Method, LBracLoc, SelectorLocs,
2893*67e74705SXin Li                                         RBracLoc, Args);
2894*67e74705SXin Li   }
2895*67e74705SXin Li 
2896*67e74705SXin Li   /// \brief Build a new Objective-C instance/class message to 'super'.
RebuildObjCMessageExpr(SourceLocation SuperLoc,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,QualType SuperType,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2897*67e74705SXin Li   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
2898*67e74705SXin Li                                     Selector Sel,
2899*67e74705SXin Li                                     ArrayRef<SourceLocation> SelectorLocs,
2900*67e74705SXin Li                                     QualType SuperType,
2901*67e74705SXin Li                                     ObjCMethodDecl *Method,
2902*67e74705SXin Li                                     SourceLocation LBracLoc,
2903*67e74705SXin Li                                     MultiExprArg Args,
2904*67e74705SXin Li                                     SourceLocation RBracLoc) {
2905*67e74705SXin Li     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
2906*67e74705SXin Li                                           SuperType,
2907*67e74705SXin Li                                           SuperLoc,
2908*67e74705SXin Li                                           Sel, Method, LBracLoc, SelectorLocs,
2909*67e74705SXin Li                                           RBracLoc, Args)
2910*67e74705SXin Li                                       : SemaRef.BuildClassMessage(nullptr,
2911*67e74705SXin Li                                           SuperType,
2912*67e74705SXin Li                                           SuperLoc,
2913*67e74705SXin Li                                           Sel, Method, LBracLoc, SelectorLocs,
2914*67e74705SXin Li                                           RBracLoc, Args);
2915*67e74705SXin Li 
2916*67e74705SXin Li 
2917*67e74705SXin Li   }
2918*67e74705SXin Li 
2919*67e74705SXin Li   /// \brief Build a new Objective-C ivar reference expression.
2920*67e74705SXin Li   ///
2921*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2922*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIvarRefExpr(Expr * BaseArg,ObjCIvarDecl * Ivar,SourceLocation IvarLoc,bool IsArrow,bool IsFreeIvar)2923*67e74705SXin Li   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2924*67e74705SXin Li                                           SourceLocation IvarLoc,
2925*67e74705SXin Li                                           bool IsArrow, bool IsFreeIvar) {
2926*67e74705SXin Li     // FIXME: We lose track of the IsFreeIvar bit.
2927*67e74705SXin Li     CXXScopeSpec SS;
2928*67e74705SXin Li     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2929*67e74705SXin Li     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2930*67e74705SXin Li                                               /*FIXME:*/IvarLoc, IsArrow,
2931*67e74705SXin Li                                               SS, SourceLocation(),
2932*67e74705SXin Li                                               /*FirstQualifierInScope=*/nullptr,
2933*67e74705SXin Li                                               NameInfo,
2934*67e74705SXin Li                                               /*TemplateArgs=*/nullptr,
2935*67e74705SXin Li                                               /*S=*/nullptr);
2936*67e74705SXin Li   }
2937*67e74705SXin Li 
2938*67e74705SXin Li   /// \brief Build a new Objective-C property reference expression.
2939*67e74705SXin Li   ///
2940*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2941*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * BaseArg,ObjCPropertyDecl * Property,SourceLocation PropertyLoc)2942*67e74705SXin Li   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2943*67e74705SXin Li                                         ObjCPropertyDecl *Property,
2944*67e74705SXin Li                                         SourceLocation PropertyLoc) {
2945*67e74705SXin Li     CXXScopeSpec SS;
2946*67e74705SXin Li     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2947*67e74705SXin Li     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2948*67e74705SXin Li                                               /*FIXME:*/PropertyLoc,
2949*67e74705SXin Li                                               /*IsArrow=*/false,
2950*67e74705SXin Li                                               SS, SourceLocation(),
2951*67e74705SXin Li                                               /*FirstQualifierInScope=*/nullptr,
2952*67e74705SXin Li                                               NameInfo,
2953*67e74705SXin Li                                               /*TemplateArgs=*/nullptr,
2954*67e74705SXin Li                                               /*S=*/nullptr);
2955*67e74705SXin Li   }
2956*67e74705SXin Li 
2957*67e74705SXin Li   /// \brief Build a new Objective-C property reference expression.
2958*67e74705SXin Li   ///
2959*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2960*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * Base,QualType T,ObjCMethodDecl * Getter,ObjCMethodDecl * Setter,SourceLocation PropertyLoc)2961*67e74705SXin Li   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2962*67e74705SXin Li                                         ObjCMethodDecl *Getter,
2963*67e74705SXin Li                                         ObjCMethodDecl *Setter,
2964*67e74705SXin Li                                         SourceLocation PropertyLoc) {
2965*67e74705SXin Li     // Since these expressions can only be value-dependent, we do not
2966*67e74705SXin Li     // need to perform semantic analysis again.
2967*67e74705SXin Li     return Owned(
2968*67e74705SXin Li       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2969*67e74705SXin Li                                                   VK_LValue, OK_ObjCProperty,
2970*67e74705SXin Li                                                   PropertyLoc, Base));
2971*67e74705SXin Li   }
2972*67e74705SXin Li 
2973*67e74705SXin Li   /// \brief Build a new Objective-C "isa" expression.
2974*67e74705SXin Li   ///
2975*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2976*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildObjCIsaExpr(Expr * BaseArg,SourceLocation IsaLoc,SourceLocation OpLoc,bool IsArrow)2977*67e74705SXin Li   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2978*67e74705SXin Li                                 SourceLocation OpLoc, bool IsArrow) {
2979*67e74705SXin Li     CXXScopeSpec SS;
2980*67e74705SXin Li     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2981*67e74705SXin Li     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2982*67e74705SXin Li                                               OpLoc, IsArrow,
2983*67e74705SXin Li                                               SS, SourceLocation(),
2984*67e74705SXin Li                                               /*FirstQualifierInScope=*/nullptr,
2985*67e74705SXin Li                                               NameInfo,
2986*67e74705SXin Li                                               /*TemplateArgs=*/nullptr,
2987*67e74705SXin Li                                               /*S=*/nullptr);
2988*67e74705SXin Li   }
2989*67e74705SXin Li 
2990*67e74705SXin Li   /// \brief Build a new shuffle vector expression.
2991*67e74705SXin Li   ///
2992*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
2993*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2994*67e74705SXin Li   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2995*67e74705SXin Li                                       MultiExprArg SubExprs,
2996*67e74705SXin Li                                       SourceLocation RParenLoc) {
2997*67e74705SXin Li     // Find the declaration for __builtin_shufflevector
2998*67e74705SXin Li     const IdentifierInfo &Name
2999*67e74705SXin Li       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3000*67e74705SXin Li     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3001*67e74705SXin Li     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3002*67e74705SXin Li     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3003*67e74705SXin Li 
3004*67e74705SXin Li     // Build a reference to the __builtin_shufflevector builtin
3005*67e74705SXin Li     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3006*67e74705SXin Li     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3007*67e74705SXin Li                                                   SemaRef.Context.BuiltinFnTy,
3008*67e74705SXin Li                                                   VK_RValue, BuiltinLoc);
3009*67e74705SXin Li     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3010*67e74705SXin Li     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3011*67e74705SXin Li                                        CK_BuiltinFnToFnPtr).get();
3012*67e74705SXin Li 
3013*67e74705SXin Li     // Build the CallExpr
3014*67e74705SXin Li     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3015*67e74705SXin Li         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3016*67e74705SXin Li         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3017*67e74705SXin Li 
3018*67e74705SXin Li     // Type-check the __builtin_shufflevector expression.
3019*67e74705SXin Li     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3020*67e74705SXin Li   }
3021*67e74705SXin Li 
3022*67e74705SXin Li   /// \brief Build a new convert vector expression.
RebuildConvertVectorExpr(SourceLocation BuiltinLoc,Expr * SrcExpr,TypeSourceInfo * DstTInfo,SourceLocation RParenLoc)3023*67e74705SXin Li   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3024*67e74705SXin Li                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3025*67e74705SXin Li                                       SourceLocation RParenLoc) {
3026*67e74705SXin Li     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3027*67e74705SXin Li                                          BuiltinLoc, RParenLoc);
3028*67e74705SXin Li   }
3029*67e74705SXin Li 
3030*67e74705SXin Li   /// \brief Build a new template argument pack expansion.
3031*67e74705SXin Li   ///
3032*67e74705SXin Li   /// By default, performs semantic analysis to build a new pack expansion
3033*67e74705SXin Li   /// for a template argument. Subclasses may override this routine to provide
3034*67e74705SXin Li   /// different behavior.
RebuildPackExpansion(TemplateArgumentLoc Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)3035*67e74705SXin Li   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3036*67e74705SXin Li                                            SourceLocation EllipsisLoc,
3037*67e74705SXin Li                                            Optional<unsigned> NumExpansions) {
3038*67e74705SXin Li     switch (Pattern.getArgument().getKind()) {
3039*67e74705SXin Li     case TemplateArgument::Expression: {
3040*67e74705SXin Li       ExprResult Result
3041*67e74705SXin Li         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3042*67e74705SXin Li                                        EllipsisLoc, NumExpansions);
3043*67e74705SXin Li       if (Result.isInvalid())
3044*67e74705SXin Li         return TemplateArgumentLoc();
3045*67e74705SXin Li 
3046*67e74705SXin Li       return TemplateArgumentLoc(Result.get(), Result.get());
3047*67e74705SXin Li     }
3048*67e74705SXin Li 
3049*67e74705SXin Li     case TemplateArgument::Template:
3050*67e74705SXin Li       return TemplateArgumentLoc(TemplateArgument(
3051*67e74705SXin Li                                           Pattern.getArgument().getAsTemplate(),
3052*67e74705SXin Li                                                   NumExpansions),
3053*67e74705SXin Li                                  Pattern.getTemplateQualifierLoc(),
3054*67e74705SXin Li                                  Pattern.getTemplateNameLoc(),
3055*67e74705SXin Li                                  EllipsisLoc);
3056*67e74705SXin Li 
3057*67e74705SXin Li     case TemplateArgument::Null:
3058*67e74705SXin Li     case TemplateArgument::Integral:
3059*67e74705SXin Li     case TemplateArgument::Declaration:
3060*67e74705SXin Li     case TemplateArgument::Pack:
3061*67e74705SXin Li     case TemplateArgument::TemplateExpansion:
3062*67e74705SXin Li     case TemplateArgument::NullPtr:
3063*67e74705SXin Li       llvm_unreachable("Pack expansion pattern has no parameter packs");
3064*67e74705SXin Li 
3065*67e74705SXin Li     case TemplateArgument::Type:
3066*67e74705SXin Li       if (TypeSourceInfo *Expansion
3067*67e74705SXin Li             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3068*67e74705SXin Li                                            EllipsisLoc,
3069*67e74705SXin Li                                            NumExpansions))
3070*67e74705SXin Li         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3071*67e74705SXin Li                                    Expansion);
3072*67e74705SXin Li       break;
3073*67e74705SXin Li     }
3074*67e74705SXin Li 
3075*67e74705SXin Li     return TemplateArgumentLoc();
3076*67e74705SXin Li   }
3077*67e74705SXin Li 
3078*67e74705SXin Li   /// \brief Build a new expression pack expansion.
3079*67e74705SXin Li   ///
3080*67e74705SXin Li   /// By default, performs semantic analysis to build a new pack expansion
3081*67e74705SXin Li   /// for an expression. Subclasses may override this routine to provide
3082*67e74705SXin Li   /// different behavior.
RebuildPackExpansion(Expr * Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)3083*67e74705SXin Li   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3084*67e74705SXin Li                                   Optional<unsigned> NumExpansions) {
3085*67e74705SXin Li     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3086*67e74705SXin Li   }
3087*67e74705SXin Li 
3088*67e74705SXin Li   /// \brief Build a new C++1z fold-expression.
3089*67e74705SXin Li   ///
3090*67e74705SXin Li   /// By default, performs semantic analysis in order to build a new fold
3091*67e74705SXin Li   /// expression.
RebuildCXXFoldExpr(SourceLocation LParenLoc,Expr * LHS,BinaryOperatorKind Operator,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation RParenLoc)3092*67e74705SXin Li   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3093*67e74705SXin Li                                 BinaryOperatorKind Operator,
3094*67e74705SXin Li                                 SourceLocation EllipsisLoc, Expr *RHS,
3095*67e74705SXin Li                                 SourceLocation RParenLoc) {
3096*67e74705SXin Li     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3097*67e74705SXin Li                                       RHS, RParenLoc);
3098*67e74705SXin Li   }
3099*67e74705SXin Li 
3100*67e74705SXin Li   /// \brief Build an empty C++1z fold-expression with the given operator.
3101*67e74705SXin Li   ///
3102*67e74705SXin Li   /// By default, produces the fallback value for the fold-expression, or
3103*67e74705SXin Li   /// produce an error if there is no fallback value.
RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,BinaryOperatorKind Operator)3104*67e74705SXin Li   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3105*67e74705SXin Li                                      BinaryOperatorKind Operator) {
3106*67e74705SXin Li     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3107*67e74705SXin Li   }
3108*67e74705SXin Li 
3109*67e74705SXin Li   /// \brief Build a new atomic operation expression.
3110*67e74705SXin Li   ///
3111*67e74705SXin Li   /// By default, performs semantic analysis to build the new expression.
3112*67e74705SXin Li   /// Subclasses may override this routine to provide different behavior.
RebuildAtomicExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,QualType RetTy,AtomicExpr::AtomicOp Op,SourceLocation RParenLoc)3113*67e74705SXin Li   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3114*67e74705SXin Li                                MultiExprArg SubExprs,
3115*67e74705SXin Li                                QualType RetTy,
3116*67e74705SXin Li                                AtomicExpr::AtomicOp Op,
3117*67e74705SXin Li                                SourceLocation RParenLoc) {
3118*67e74705SXin Li     // Just create the expression; there is not any interesting semantic
3119*67e74705SXin Li     // analysis here because we can't actually build an AtomicExpr until
3120*67e74705SXin Li     // we are sure it is semantically sound.
3121*67e74705SXin Li     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3122*67e74705SXin Li                                             RParenLoc);
3123*67e74705SXin Li   }
3124*67e74705SXin Li 
3125*67e74705SXin Li private:
3126*67e74705SXin Li   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3127*67e74705SXin Li                                      QualType ObjectType,
3128*67e74705SXin Li                                      NamedDecl *FirstQualifierInScope,
3129*67e74705SXin Li                                      CXXScopeSpec &SS);
3130*67e74705SXin Li 
3131*67e74705SXin Li   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3132*67e74705SXin Li                                              QualType ObjectType,
3133*67e74705SXin Li                                              NamedDecl *FirstQualifierInScope,
3134*67e74705SXin Li                                              CXXScopeSpec &SS);
3135*67e74705SXin Li 
3136*67e74705SXin Li   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3137*67e74705SXin Li                                             NamedDecl *FirstQualifierInScope,
3138*67e74705SXin Li                                             CXXScopeSpec &SS);
3139*67e74705SXin Li };
3140*67e74705SXin Li 
3141*67e74705SXin Li template<typename Derived>
TransformStmt(Stmt * S)3142*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3143*67e74705SXin Li   if (!S)
3144*67e74705SXin Li     return S;
3145*67e74705SXin Li 
3146*67e74705SXin Li   switch (S->getStmtClass()) {
3147*67e74705SXin Li   case Stmt::NoStmtClass: break;
3148*67e74705SXin Li 
3149*67e74705SXin Li   // Transform individual statement nodes
3150*67e74705SXin Li #define STMT(Node, Parent)                                              \
3151*67e74705SXin Li   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3152*67e74705SXin Li #define ABSTRACT_STMT(Node)
3153*67e74705SXin Li #define EXPR(Node, Parent)
3154*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
3155*67e74705SXin Li 
3156*67e74705SXin Li   // Transform expressions by calling TransformExpr.
3157*67e74705SXin Li #define STMT(Node, Parent)
3158*67e74705SXin Li #define ABSTRACT_STMT(Stmt)
3159*67e74705SXin Li #define EXPR(Node, Parent) case Stmt::Node##Class:
3160*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
3161*67e74705SXin Li     {
3162*67e74705SXin Li       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3163*67e74705SXin Li       if (E.isInvalid())
3164*67e74705SXin Li         return StmtError();
3165*67e74705SXin Li 
3166*67e74705SXin Li       return getSema().ActOnExprStmt(E);
3167*67e74705SXin Li     }
3168*67e74705SXin Li   }
3169*67e74705SXin Li 
3170*67e74705SXin Li   return S;
3171*67e74705SXin Li }
3172*67e74705SXin Li 
3173*67e74705SXin Li template<typename Derived>
TransformOMPClause(OMPClause * S)3174*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3175*67e74705SXin Li   if (!S)
3176*67e74705SXin Li     return S;
3177*67e74705SXin Li 
3178*67e74705SXin Li   switch (S->getClauseKind()) {
3179*67e74705SXin Li   default: break;
3180*67e74705SXin Li   // Transform individual clause nodes
3181*67e74705SXin Li #define OPENMP_CLAUSE(Name, Class)                                             \
3182*67e74705SXin Li   case OMPC_ ## Name :                                                         \
3183*67e74705SXin Li     return getDerived().Transform ## Class(cast<Class>(S));
3184*67e74705SXin Li #include "clang/Basic/OpenMPKinds.def"
3185*67e74705SXin Li   }
3186*67e74705SXin Li 
3187*67e74705SXin Li   return S;
3188*67e74705SXin Li }
3189*67e74705SXin Li 
3190*67e74705SXin Li 
3191*67e74705SXin Li template<typename Derived>
TransformExpr(Expr * E)3192*67e74705SXin Li ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3193*67e74705SXin Li   if (!E)
3194*67e74705SXin Li     return E;
3195*67e74705SXin Li 
3196*67e74705SXin Li   switch (E->getStmtClass()) {
3197*67e74705SXin Li     case Stmt::NoStmtClass: break;
3198*67e74705SXin Li #define STMT(Node, Parent) case Stmt::Node##Class: break;
3199*67e74705SXin Li #define ABSTRACT_STMT(Stmt)
3200*67e74705SXin Li #define EXPR(Node, Parent)                                              \
3201*67e74705SXin Li     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3202*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
3203*67e74705SXin Li   }
3204*67e74705SXin Li 
3205*67e74705SXin Li   return E;
3206*67e74705SXin Li }
3207*67e74705SXin Li 
3208*67e74705SXin Li template<typename Derived>
TransformInitializer(Expr * Init,bool NotCopyInit)3209*67e74705SXin Li ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3210*67e74705SXin Li                                                         bool NotCopyInit) {
3211*67e74705SXin Li   // Initializers are instantiated like expressions, except that various outer
3212*67e74705SXin Li   // layers are stripped.
3213*67e74705SXin Li   if (!Init)
3214*67e74705SXin Li     return Init;
3215*67e74705SXin Li 
3216*67e74705SXin Li   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3217*67e74705SXin Li     Init = ExprTemp->getSubExpr();
3218*67e74705SXin Li 
3219*67e74705SXin Li   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3220*67e74705SXin Li     Init = MTE->GetTemporaryExpr();
3221*67e74705SXin Li 
3222*67e74705SXin Li   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3223*67e74705SXin Li     Init = Binder->getSubExpr();
3224*67e74705SXin Li 
3225*67e74705SXin Li   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3226*67e74705SXin Li     Init = ICE->getSubExprAsWritten();
3227*67e74705SXin Li 
3228*67e74705SXin Li   if (CXXStdInitializerListExpr *ILE =
3229*67e74705SXin Li           dyn_cast<CXXStdInitializerListExpr>(Init))
3230*67e74705SXin Li     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3231*67e74705SXin Li 
3232*67e74705SXin Li   // If this is copy-initialization, we only need to reconstruct
3233*67e74705SXin Li   // InitListExprs. Other forms of copy-initialization will be a no-op if
3234*67e74705SXin Li   // the initializer is already the right type.
3235*67e74705SXin Li   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3236*67e74705SXin Li   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3237*67e74705SXin Li     return getDerived().TransformExpr(Init);
3238*67e74705SXin Li 
3239*67e74705SXin Li   // Revert value-initialization back to empty parens.
3240*67e74705SXin Li   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3241*67e74705SXin Li     SourceRange Parens = VIE->getSourceRange();
3242*67e74705SXin Li     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3243*67e74705SXin Li                                              Parens.getEnd());
3244*67e74705SXin Li   }
3245*67e74705SXin Li 
3246*67e74705SXin Li   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3247*67e74705SXin Li   if (isa<ImplicitValueInitExpr>(Init))
3248*67e74705SXin Li     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3249*67e74705SXin Li                                              SourceLocation());
3250*67e74705SXin Li 
3251*67e74705SXin Li   // Revert initialization by constructor back to a parenthesized or braced list
3252*67e74705SXin Li   // of expressions. Any other form of initializer can just be reused directly.
3253*67e74705SXin Li   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3254*67e74705SXin Li     return getDerived().TransformExpr(Init);
3255*67e74705SXin Li 
3256*67e74705SXin Li   // If the initialization implicitly converted an initializer list to a
3257*67e74705SXin Li   // std::initializer_list object, unwrap the std::initializer_list too.
3258*67e74705SXin Li   if (Construct && Construct->isStdInitListInitialization())
3259*67e74705SXin Li     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3260*67e74705SXin Li 
3261*67e74705SXin Li   SmallVector<Expr*, 8> NewArgs;
3262*67e74705SXin Li   bool ArgChanged = false;
3263*67e74705SXin Li   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3264*67e74705SXin Li                                   /*IsCall*/true, NewArgs, &ArgChanged))
3265*67e74705SXin Li     return ExprError();
3266*67e74705SXin Li 
3267*67e74705SXin Li   // If this was list initialization, revert to list form.
3268*67e74705SXin Li   if (Construct->isListInitialization())
3269*67e74705SXin Li     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3270*67e74705SXin Li                                         Construct->getLocEnd(),
3271*67e74705SXin Li                                         Construct->getType());
3272*67e74705SXin Li 
3273*67e74705SXin Li   // Build a ParenListExpr to represent anything else.
3274*67e74705SXin Li   SourceRange Parens = Construct->getParenOrBraceRange();
3275*67e74705SXin Li   if (Parens.isInvalid()) {
3276*67e74705SXin Li     // This was a variable declaration's initialization for which no initializer
3277*67e74705SXin Li     // was specified.
3278*67e74705SXin Li     assert(NewArgs.empty() &&
3279*67e74705SXin Li            "no parens or braces but have direct init with arguments?");
3280*67e74705SXin Li     return ExprEmpty();
3281*67e74705SXin Li   }
3282*67e74705SXin Li   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3283*67e74705SXin Li                                            Parens.getEnd());
3284*67e74705SXin Li }
3285*67e74705SXin Li 
3286*67e74705SXin Li template<typename Derived>
TransformExprs(Expr * const * Inputs,unsigned NumInputs,bool IsCall,SmallVectorImpl<Expr * > & Outputs,bool * ArgChanged)3287*67e74705SXin Li bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3288*67e74705SXin Li                                             unsigned NumInputs,
3289*67e74705SXin Li                                             bool IsCall,
3290*67e74705SXin Li                                       SmallVectorImpl<Expr *> &Outputs,
3291*67e74705SXin Li                                             bool *ArgChanged) {
3292*67e74705SXin Li   for (unsigned I = 0; I != NumInputs; ++I) {
3293*67e74705SXin Li     // If requested, drop call arguments that need to be dropped.
3294*67e74705SXin Li     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3295*67e74705SXin Li       if (ArgChanged)
3296*67e74705SXin Li         *ArgChanged = true;
3297*67e74705SXin Li 
3298*67e74705SXin Li       break;
3299*67e74705SXin Li     }
3300*67e74705SXin Li 
3301*67e74705SXin Li     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3302*67e74705SXin Li       Expr *Pattern = Expansion->getPattern();
3303*67e74705SXin Li 
3304*67e74705SXin Li       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3305*67e74705SXin Li       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3306*67e74705SXin Li       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3307*67e74705SXin Li 
3308*67e74705SXin Li       // Determine whether the set of unexpanded parameter packs can and should
3309*67e74705SXin Li       // be expanded.
3310*67e74705SXin Li       bool Expand = true;
3311*67e74705SXin Li       bool RetainExpansion = false;
3312*67e74705SXin Li       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3313*67e74705SXin Li       Optional<unsigned> NumExpansions = OrigNumExpansions;
3314*67e74705SXin Li       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3315*67e74705SXin Li                                                Pattern->getSourceRange(),
3316*67e74705SXin Li                                                Unexpanded,
3317*67e74705SXin Li                                                Expand, RetainExpansion,
3318*67e74705SXin Li                                                NumExpansions))
3319*67e74705SXin Li         return true;
3320*67e74705SXin Li 
3321*67e74705SXin Li       if (!Expand) {
3322*67e74705SXin Li         // The transform has determined that we should perform a simple
3323*67e74705SXin Li         // transformation on the pack expansion, producing another pack
3324*67e74705SXin Li         // expansion.
3325*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3326*67e74705SXin Li         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3327*67e74705SXin Li         if (OutPattern.isInvalid())
3328*67e74705SXin Li           return true;
3329*67e74705SXin Li 
3330*67e74705SXin Li         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3331*67e74705SXin Li                                                 Expansion->getEllipsisLoc(),
3332*67e74705SXin Li                                                            NumExpansions);
3333*67e74705SXin Li         if (Out.isInvalid())
3334*67e74705SXin Li           return true;
3335*67e74705SXin Li 
3336*67e74705SXin Li         if (ArgChanged)
3337*67e74705SXin Li           *ArgChanged = true;
3338*67e74705SXin Li         Outputs.push_back(Out.get());
3339*67e74705SXin Li         continue;
3340*67e74705SXin Li       }
3341*67e74705SXin Li 
3342*67e74705SXin Li       // Record right away that the argument was changed.  This needs
3343*67e74705SXin Li       // to happen even if the array expands to nothing.
3344*67e74705SXin Li       if (ArgChanged) *ArgChanged = true;
3345*67e74705SXin Li 
3346*67e74705SXin Li       // The transform has determined that we should perform an elementwise
3347*67e74705SXin Li       // expansion of the pattern. Do so.
3348*67e74705SXin Li       for (unsigned I = 0; I != *NumExpansions; ++I) {
3349*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3350*67e74705SXin Li         ExprResult Out = getDerived().TransformExpr(Pattern);
3351*67e74705SXin Li         if (Out.isInvalid())
3352*67e74705SXin Li           return true;
3353*67e74705SXin Li 
3354*67e74705SXin Li         if (Out.get()->containsUnexpandedParameterPack()) {
3355*67e74705SXin Li           Out = getDerived().RebuildPackExpansion(
3356*67e74705SXin Li               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3357*67e74705SXin Li           if (Out.isInvalid())
3358*67e74705SXin Li             return true;
3359*67e74705SXin Li         }
3360*67e74705SXin Li 
3361*67e74705SXin Li         Outputs.push_back(Out.get());
3362*67e74705SXin Li       }
3363*67e74705SXin Li 
3364*67e74705SXin Li       // If we're supposed to retain a pack expansion, do so by temporarily
3365*67e74705SXin Li       // forgetting the partially-substituted parameter pack.
3366*67e74705SXin Li       if (RetainExpansion) {
3367*67e74705SXin Li         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3368*67e74705SXin Li 
3369*67e74705SXin Li         ExprResult Out = getDerived().TransformExpr(Pattern);
3370*67e74705SXin Li         if (Out.isInvalid())
3371*67e74705SXin Li           return true;
3372*67e74705SXin Li 
3373*67e74705SXin Li         Out = getDerived().RebuildPackExpansion(
3374*67e74705SXin Li             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3375*67e74705SXin Li         if (Out.isInvalid())
3376*67e74705SXin Li           return true;
3377*67e74705SXin Li 
3378*67e74705SXin Li         Outputs.push_back(Out.get());
3379*67e74705SXin Li       }
3380*67e74705SXin Li 
3381*67e74705SXin Li       continue;
3382*67e74705SXin Li     }
3383*67e74705SXin Li 
3384*67e74705SXin Li     ExprResult Result =
3385*67e74705SXin Li       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3386*67e74705SXin Li              : getDerived().TransformExpr(Inputs[I]);
3387*67e74705SXin Li     if (Result.isInvalid())
3388*67e74705SXin Li       return true;
3389*67e74705SXin Li 
3390*67e74705SXin Li     if (Result.get() != Inputs[I] && ArgChanged)
3391*67e74705SXin Li       *ArgChanged = true;
3392*67e74705SXin Li 
3393*67e74705SXin Li     Outputs.push_back(Result.get());
3394*67e74705SXin Li   }
3395*67e74705SXin Li 
3396*67e74705SXin Li   return false;
3397*67e74705SXin Li }
3398*67e74705SXin Li 
3399*67e74705SXin Li template <typename Derived>
TransformCondition(SourceLocation Loc,VarDecl * Var,Expr * Expr,Sema::ConditionKind Kind)3400*67e74705SXin Li Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3401*67e74705SXin Li     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3402*67e74705SXin Li   if (Var) {
3403*67e74705SXin Li     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3404*67e74705SXin Li         getDerived().TransformDefinition(Var->getLocation(), Var));
3405*67e74705SXin Li 
3406*67e74705SXin Li     if (!ConditionVar)
3407*67e74705SXin Li       return Sema::ConditionError();
3408*67e74705SXin Li 
3409*67e74705SXin Li     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3410*67e74705SXin Li   }
3411*67e74705SXin Li 
3412*67e74705SXin Li   if (Expr) {
3413*67e74705SXin Li     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3414*67e74705SXin Li 
3415*67e74705SXin Li     if (CondExpr.isInvalid())
3416*67e74705SXin Li       return Sema::ConditionError();
3417*67e74705SXin Li 
3418*67e74705SXin Li     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3419*67e74705SXin Li   }
3420*67e74705SXin Li 
3421*67e74705SXin Li   return Sema::ConditionResult();
3422*67e74705SXin Li }
3423*67e74705SXin Li 
3424*67e74705SXin Li template<typename Derived>
3425*67e74705SXin Li NestedNameSpecifierLoc
TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,QualType ObjectType,NamedDecl * FirstQualifierInScope)3426*67e74705SXin Li TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3427*67e74705SXin Li                                                     NestedNameSpecifierLoc NNS,
3428*67e74705SXin Li                                                      QualType ObjectType,
3429*67e74705SXin Li                                              NamedDecl *FirstQualifierInScope) {
3430*67e74705SXin Li   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3431*67e74705SXin Li   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3432*67e74705SXin Li        Qualifier = Qualifier.getPrefix())
3433*67e74705SXin Li     Qualifiers.push_back(Qualifier);
3434*67e74705SXin Li 
3435*67e74705SXin Li   CXXScopeSpec SS;
3436*67e74705SXin Li   while (!Qualifiers.empty()) {
3437*67e74705SXin Li     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3438*67e74705SXin Li     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3439*67e74705SXin Li 
3440*67e74705SXin Li     switch (QNNS->getKind()) {
3441*67e74705SXin Li     case NestedNameSpecifier::Identifier:
3442*67e74705SXin Li       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr,
3443*67e74705SXin Li                                               *QNNS->getAsIdentifier(),
3444*67e74705SXin Li                                               Q.getLocalBeginLoc(),
3445*67e74705SXin Li                                               Q.getLocalEndLoc(),
3446*67e74705SXin Li                                               ObjectType, false, SS,
3447*67e74705SXin Li                                               FirstQualifierInScope, false))
3448*67e74705SXin Li         return NestedNameSpecifierLoc();
3449*67e74705SXin Li 
3450*67e74705SXin Li       break;
3451*67e74705SXin Li 
3452*67e74705SXin Li     case NestedNameSpecifier::Namespace: {
3453*67e74705SXin Li       NamespaceDecl *NS
3454*67e74705SXin Li         = cast_or_null<NamespaceDecl>(
3455*67e74705SXin Li                                     getDerived().TransformDecl(
3456*67e74705SXin Li                                                           Q.getLocalBeginLoc(),
3457*67e74705SXin Li                                                        QNNS->getAsNamespace()));
3458*67e74705SXin Li       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3459*67e74705SXin Li       break;
3460*67e74705SXin Li     }
3461*67e74705SXin Li 
3462*67e74705SXin Li     case NestedNameSpecifier::NamespaceAlias: {
3463*67e74705SXin Li       NamespaceAliasDecl *Alias
3464*67e74705SXin Li         = cast_or_null<NamespaceAliasDecl>(
3465*67e74705SXin Li                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3466*67e74705SXin Li                                                  QNNS->getAsNamespaceAlias()));
3467*67e74705SXin Li       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3468*67e74705SXin Li                 Q.getLocalEndLoc());
3469*67e74705SXin Li       break;
3470*67e74705SXin Li     }
3471*67e74705SXin Li 
3472*67e74705SXin Li     case NestedNameSpecifier::Global:
3473*67e74705SXin Li       // There is no meaningful transformation that one could perform on the
3474*67e74705SXin Li       // global scope.
3475*67e74705SXin Li       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3476*67e74705SXin Li       break;
3477*67e74705SXin Li 
3478*67e74705SXin Li     case NestedNameSpecifier::Super: {
3479*67e74705SXin Li       CXXRecordDecl *RD =
3480*67e74705SXin Li           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3481*67e74705SXin Li               SourceLocation(), QNNS->getAsRecordDecl()));
3482*67e74705SXin Li       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3483*67e74705SXin Li       break;
3484*67e74705SXin Li     }
3485*67e74705SXin Li 
3486*67e74705SXin Li     case NestedNameSpecifier::TypeSpecWithTemplate:
3487*67e74705SXin Li     case NestedNameSpecifier::TypeSpec: {
3488*67e74705SXin Li       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3489*67e74705SXin Li                                               FirstQualifierInScope, SS);
3490*67e74705SXin Li 
3491*67e74705SXin Li       if (!TL)
3492*67e74705SXin Li         return NestedNameSpecifierLoc();
3493*67e74705SXin Li 
3494*67e74705SXin Li       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3495*67e74705SXin Li           (SemaRef.getLangOpts().CPlusPlus11 &&
3496*67e74705SXin Li            TL.getType()->isEnumeralType())) {
3497*67e74705SXin Li         assert(!TL.getType().hasLocalQualifiers() &&
3498*67e74705SXin Li                "Can't get cv-qualifiers here");
3499*67e74705SXin Li         if (TL.getType()->isEnumeralType())
3500*67e74705SXin Li           SemaRef.Diag(TL.getBeginLoc(),
3501*67e74705SXin Li                        diag::warn_cxx98_compat_enum_nested_name_spec);
3502*67e74705SXin Li         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3503*67e74705SXin Li                   Q.getLocalEndLoc());
3504*67e74705SXin Li         break;
3505*67e74705SXin Li       }
3506*67e74705SXin Li       // If the nested-name-specifier is an invalid type def, don't emit an
3507*67e74705SXin Li       // error because a previous error should have already been emitted.
3508*67e74705SXin Li       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3509*67e74705SXin Li       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3510*67e74705SXin Li         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3511*67e74705SXin Li           << TL.getType() << SS.getRange();
3512*67e74705SXin Li       }
3513*67e74705SXin Li       return NestedNameSpecifierLoc();
3514*67e74705SXin Li     }
3515*67e74705SXin Li     }
3516*67e74705SXin Li 
3517*67e74705SXin Li     // The qualifier-in-scope and object type only apply to the leftmost entity.
3518*67e74705SXin Li     FirstQualifierInScope = nullptr;
3519*67e74705SXin Li     ObjectType = QualType();
3520*67e74705SXin Li   }
3521*67e74705SXin Li 
3522*67e74705SXin Li   // Don't rebuild the nested-name-specifier if we don't have to.
3523*67e74705SXin Li   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3524*67e74705SXin Li       !getDerived().AlwaysRebuild())
3525*67e74705SXin Li     return NNS;
3526*67e74705SXin Li 
3527*67e74705SXin Li   // If we can re-use the source-location data from the original
3528*67e74705SXin Li   // nested-name-specifier, do so.
3529*67e74705SXin Li   if (SS.location_size() == NNS.getDataLength() &&
3530*67e74705SXin Li       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3531*67e74705SXin Li     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3532*67e74705SXin Li 
3533*67e74705SXin Li   // Allocate new nested-name-specifier location information.
3534*67e74705SXin Li   return SS.getWithLocInContext(SemaRef.Context);
3535*67e74705SXin Li }
3536*67e74705SXin Li 
3537*67e74705SXin Li template<typename Derived>
3538*67e74705SXin Li DeclarationNameInfo
3539*67e74705SXin Li TreeTransform<Derived>
TransformDeclarationNameInfo(const DeclarationNameInfo & NameInfo)3540*67e74705SXin Li ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3541*67e74705SXin Li   DeclarationName Name = NameInfo.getName();
3542*67e74705SXin Li   if (!Name)
3543*67e74705SXin Li     return DeclarationNameInfo();
3544*67e74705SXin Li 
3545*67e74705SXin Li   switch (Name.getNameKind()) {
3546*67e74705SXin Li   case DeclarationName::Identifier:
3547*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
3548*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
3549*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
3550*67e74705SXin Li   case DeclarationName::CXXOperatorName:
3551*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
3552*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
3553*67e74705SXin Li     return NameInfo;
3554*67e74705SXin Li 
3555*67e74705SXin Li   case DeclarationName::CXXConstructorName:
3556*67e74705SXin Li   case DeclarationName::CXXDestructorName:
3557*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName: {
3558*67e74705SXin Li     TypeSourceInfo *NewTInfo;
3559*67e74705SXin Li     CanQualType NewCanTy;
3560*67e74705SXin Li     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3561*67e74705SXin Li       NewTInfo = getDerived().TransformType(OldTInfo);
3562*67e74705SXin Li       if (!NewTInfo)
3563*67e74705SXin Li         return DeclarationNameInfo();
3564*67e74705SXin Li       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3565*67e74705SXin Li     }
3566*67e74705SXin Li     else {
3567*67e74705SXin Li       NewTInfo = nullptr;
3568*67e74705SXin Li       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3569*67e74705SXin Li       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3570*67e74705SXin Li       if (NewT.isNull())
3571*67e74705SXin Li         return DeclarationNameInfo();
3572*67e74705SXin Li       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3573*67e74705SXin Li     }
3574*67e74705SXin Li 
3575*67e74705SXin Li     DeclarationName NewName
3576*67e74705SXin Li       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3577*67e74705SXin Li                                                            NewCanTy);
3578*67e74705SXin Li     DeclarationNameInfo NewNameInfo(NameInfo);
3579*67e74705SXin Li     NewNameInfo.setName(NewName);
3580*67e74705SXin Li     NewNameInfo.setNamedTypeInfo(NewTInfo);
3581*67e74705SXin Li     return NewNameInfo;
3582*67e74705SXin Li   }
3583*67e74705SXin Li   }
3584*67e74705SXin Li 
3585*67e74705SXin Li   llvm_unreachable("Unknown name kind.");
3586*67e74705SXin Li }
3587*67e74705SXin Li 
3588*67e74705SXin Li template<typename Derived>
3589*67e74705SXin Li TemplateName
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)3590*67e74705SXin Li TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3591*67e74705SXin Li                                               TemplateName Name,
3592*67e74705SXin Li                                               SourceLocation NameLoc,
3593*67e74705SXin Li                                               QualType ObjectType,
3594*67e74705SXin Li                                               NamedDecl *FirstQualifierInScope) {
3595*67e74705SXin Li   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3596*67e74705SXin Li     TemplateDecl *Template = QTN->getTemplateDecl();
3597*67e74705SXin Li     assert(Template && "qualified template name must refer to a template");
3598*67e74705SXin Li 
3599*67e74705SXin Li     TemplateDecl *TransTemplate
3600*67e74705SXin Li       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3601*67e74705SXin Li                                                               Template));
3602*67e74705SXin Li     if (!TransTemplate)
3603*67e74705SXin Li       return TemplateName();
3604*67e74705SXin Li 
3605*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
3606*67e74705SXin Li         SS.getScopeRep() == QTN->getQualifier() &&
3607*67e74705SXin Li         TransTemplate == Template)
3608*67e74705SXin Li       return Name;
3609*67e74705SXin Li 
3610*67e74705SXin Li     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3611*67e74705SXin Li                                             TransTemplate);
3612*67e74705SXin Li   }
3613*67e74705SXin Li 
3614*67e74705SXin Li   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3615*67e74705SXin Li     if (SS.getScopeRep()) {
3616*67e74705SXin Li       // These apply to the scope specifier, not the template.
3617*67e74705SXin Li       ObjectType = QualType();
3618*67e74705SXin Li       FirstQualifierInScope = nullptr;
3619*67e74705SXin Li     }
3620*67e74705SXin Li 
3621*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
3622*67e74705SXin Li         SS.getScopeRep() == DTN->getQualifier() &&
3623*67e74705SXin Li         ObjectType.isNull())
3624*67e74705SXin Li       return Name;
3625*67e74705SXin Li 
3626*67e74705SXin Li     if (DTN->isIdentifier()) {
3627*67e74705SXin Li       return getDerived().RebuildTemplateName(SS,
3628*67e74705SXin Li                                               *DTN->getIdentifier(),
3629*67e74705SXin Li                                               NameLoc,
3630*67e74705SXin Li                                               ObjectType,
3631*67e74705SXin Li                                               FirstQualifierInScope);
3632*67e74705SXin Li     }
3633*67e74705SXin Li 
3634*67e74705SXin Li     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3635*67e74705SXin Li                                             ObjectType);
3636*67e74705SXin Li   }
3637*67e74705SXin Li 
3638*67e74705SXin Li   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3639*67e74705SXin Li     TemplateDecl *TransTemplate
3640*67e74705SXin Li       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3641*67e74705SXin Li                                                               Template));
3642*67e74705SXin Li     if (!TransTemplate)
3643*67e74705SXin Li       return TemplateName();
3644*67e74705SXin Li 
3645*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
3646*67e74705SXin Li         TransTemplate == Template)
3647*67e74705SXin Li       return Name;
3648*67e74705SXin Li 
3649*67e74705SXin Li     return TemplateName(TransTemplate);
3650*67e74705SXin Li   }
3651*67e74705SXin Li 
3652*67e74705SXin Li   if (SubstTemplateTemplateParmPackStorage *SubstPack
3653*67e74705SXin Li       = Name.getAsSubstTemplateTemplateParmPack()) {
3654*67e74705SXin Li     TemplateTemplateParmDecl *TransParam
3655*67e74705SXin Li     = cast_or_null<TemplateTemplateParmDecl>(
3656*67e74705SXin Li             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3657*67e74705SXin Li     if (!TransParam)
3658*67e74705SXin Li       return TemplateName();
3659*67e74705SXin Li 
3660*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
3661*67e74705SXin Li         TransParam == SubstPack->getParameterPack())
3662*67e74705SXin Li       return Name;
3663*67e74705SXin Li 
3664*67e74705SXin Li     return getDerived().RebuildTemplateName(TransParam,
3665*67e74705SXin Li                                             SubstPack->getArgumentPack());
3666*67e74705SXin Li   }
3667*67e74705SXin Li 
3668*67e74705SXin Li   // These should be getting filtered out before they reach the AST.
3669*67e74705SXin Li   llvm_unreachable("overloaded function decl survived to here");
3670*67e74705SXin Li }
3671*67e74705SXin Li 
3672*67e74705SXin Li template<typename Derived>
InventTemplateArgumentLoc(const TemplateArgument & Arg,TemplateArgumentLoc & Output)3673*67e74705SXin Li void TreeTransform<Derived>::InventTemplateArgumentLoc(
3674*67e74705SXin Li                                          const TemplateArgument &Arg,
3675*67e74705SXin Li                                          TemplateArgumentLoc &Output) {
3676*67e74705SXin Li   SourceLocation Loc = getDerived().getBaseLocation();
3677*67e74705SXin Li   switch (Arg.getKind()) {
3678*67e74705SXin Li   case TemplateArgument::Null:
3679*67e74705SXin Li     llvm_unreachable("null template argument in TreeTransform");
3680*67e74705SXin Li     break;
3681*67e74705SXin Li 
3682*67e74705SXin Li   case TemplateArgument::Type:
3683*67e74705SXin Li     Output = TemplateArgumentLoc(Arg,
3684*67e74705SXin Li                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3685*67e74705SXin Li 
3686*67e74705SXin Li     break;
3687*67e74705SXin Li 
3688*67e74705SXin Li   case TemplateArgument::Template:
3689*67e74705SXin Li   case TemplateArgument::TemplateExpansion: {
3690*67e74705SXin Li     NestedNameSpecifierLocBuilder Builder;
3691*67e74705SXin Li     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3692*67e74705SXin Li     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3693*67e74705SXin Li       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3694*67e74705SXin Li     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3695*67e74705SXin Li       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3696*67e74705SXin Li 
3697*67e74705SXin Li     if (Arg.getKind() == TemplateArgument::Template)
3698*67e74705SXin Li       Output = TemplateArgumentLoc(Arg,
3699*67e74705SXin Li                                    Builder.getWithLocInContext(SemaRef.Context),
3700*67e74705SXin Li                                    Loc);
3701*67e74705SXin Li     else
3702*67e74705SXin Li       Output = TemplateArgumentLoc(Arg,
3703*67e74705SXin Li                                    Builder.getWithLocInContext(SemaRef.Context),
3704*67e74705SXin Li                                    Loc, Loc);
3705*67e74705SXin Li 
3706*67e74705SXin Li     break;
3707*67e74705SXin Li   }
3708*67e74705SXin Li 
3709*67e74705SXin Li   case TemplateArgument::Expression:
3710*67e74705SXin Li     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3711*67e74705SXin Li     break;
3712*67e74705SXin Li 
3713*67e74705SXin Li   case TemplateArgument::Declaration:
3714*67e74705SXin Li   case TemplateArgument::Integral:
3715*67e74705SXin Li   case TemplateArgument::Pack:
3716*67e74705SXin Li   case TemplateArgument::NullPtr:
3717*67e74705SXin Li     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3718*67e74705SXin Li     break;
3719*67e74705SXin Li   }
3720*67e74705SXin Li }
3721*67e74705SXin Li 
3722*67e74705SXin Li template<typename Derived>
TransformTemplateArgument(const TemplateArgumentLoc & Input,TemplateArgumentLoc & Output,bool Uneval)3723*67e74705SXin Li bool TreeTransform<Derived>::TransformTemplateArgument(
3724*67e74705SXin Li                                          const TemplateArgumentLoc &Input,
3725*67e74705SXin Li                                          TemplateArgumentLoc &Output, bool Uneval) {
3726*67e74705SXin Li   const TemplateArgument &Arg = Input.getArgument();
3727*67e74705SXin Li   switch (Arg.getKind()) {
3728*67e74705SXin Li   case TemplateArgument::Null:
3729*67e74705SXin Li   case TemplateArgument::Integral:
3730*67e74705SXin Li   case TemplateArgument::Pack:
3731*67e74705SXin Li   case TemplateArgument::Declaration:
3732*67e74705SXin Li   case TemplateArgument::NullPtr:
3733*67e74705SXin Li     llvm_unreachable("Unexpected TemplateArgument");
3734*67e74705SXin Li 
3735*67e74705SXin Li   case TemplateArgument::Type: {
3736*67e74705SXin Li     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3737*67e74705SXin Li     if (!DI)
3738*67e74705SXin Li       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3739*67e74705SXin Li 
3740*67e74705SXin Li     DI = getDerived().TransformType(DI);
3741*67e74705SXin Li     if (!DI) return true;
3742*67e74705SXin Li 
3743*67e74705SXin Li     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3744*67e74705SXin Li     return false;
3745*67e74705SXin Li   }
3746*67e74705SXin Li 
3747*67e74705SXin Li   case TemplateArgument::Template: {
3748*67e74705SXin Li     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3749*67e74705SXin Li     if (QualifierLoc) {
3750*67e74705SXin Li       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3751*67e74705SXin Li       if (!QualifierLoc)
3752*67e74705SXin Li         return true;
3753*67e74705SXin Li     }
3754*67e74705SXin Li 
3755*67e74705SXin Li     CXXScopeSpec SS;
3756*67e74705SXin Li     SS.Adopt(QualifierLoc);
3757*67e74705SXin Li     TemplateName Template
3758*67e74705SXin Li       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3759*67e74705SXin Li                                            Input.getTemplateNameLoc());
3760*67e74705SXin Li     if (Template.isNull())
3761*67e74705SXin Li       return true;
3762*67e74705SXin Li 
3763*67e74705SXin Li     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3764*67e74705SXin Li                                  Input.getTemplateNameLoc());
3765*67e74705SXin Li     return false;
3766*67e74705SXin Li   }
3767*67e74705SXin Li 
3768*67e74705SXin Li   case TemplateArgument::TemplateExpansion:
3769*67e74705SXin Li     llvm_unreachable("Caller should expand pack expansions");
3770*67e74705SXin Li 
3771*67e74705SXin Li   case TemplateArgument::Expression: {
3772*67e74705SXin Li     // Template argument expressions are constant expressions.
3773*67e74705SXin Li     EnterExpressionEvaluationContext Unevaluated(
3774*67e74705SXin Li         getSema(), Uneval ? Sema::Unevaluated : Sema::ConstantEvaluated);
3775*67e74705SXin Li 
3776*67e74705SXin Li     Expr *InputExpr = Input.getSourceExpression();
3777*67e74705SXin Li     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3778*67e74705SXin Li 
3779*67e74705SXin Li     ExprResult E = getDerived().TransformExpr(InputExpr);
3780*67e74705SXin Li     E = SemaRef.ActOnConstantExpression(E);
3781*67e74705SXin Li     if (E.isInvalid()) return true;
3782*67e74705SXin Li     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3783*67e74705SXin Li     return false;
3784*67e74705SXin Li   }
3785*67e74705SXin Li   }
3786*67e74705SXin Li 
3787*67e74705SXin Li   // Work around bogus GCC warning
3788*67e74705SXin Li   return true;
3789*67e74705SXin Li }
3790*67e74705SXin Li 
3791*67e74705SXin Li /// \brief Iterator adaptor that invents template argument location information
3792*67e74705SXin Li /// for each of the template arguments in its underlying iterator.
3793*67e74705SXin Li template<typename Derived, typename InputIterator>
3794*67e74705SXin Li class TemplateArgumentLocInventIterator {
3795*67e74705SXin Li   TreeTransform<Derived> &Self;
3796*67e74705SXin Li   InputIterator Iter;
3797*67e74705SXin Li 
3798*67e74705SXin Li public:
3799*67e74705SXin Li   typedef TemplateArgumentLoc value_type;
3800*67e74705SXin Li   typedef TemplateArgumentLoc reference;
3801*67e74705SXin Li   typedef typename std::iterator_traits<InputIterator>::difference_type
3802*67e74705SXin Li     difference_type;
3803*67e74705SXin Li   typedef std::input_iterator_tag iterator_category;
3804*67e74705SXin Li 
3805*67e74705SXin Li   class pointer {
3806*67e74705SXin Li     TemplateArgumentLoc Arg;
3807*67e74705SXin Li 
3808*67e74705SXin Li   public:
pointer(TemplateArgumentLoc Arg)3809*67e74705SXin Li     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3810*67e74705SXin Li 
3811*67e74705SXin Li     const TemplateArgumentLoc *operator->() const { return &Arg; }
3812*67e74705SXin Li   };
3813*67e74705SXin Li 
TemplateArgumentLocInventIterator()3814*67e74705SXin Li   TemplateArgumentLocInventIterator() { }
3815*67e74705SXin Li 
TemplateArgumentLocInventIterator(TreeTransform<Derived> & Self,InputIterator Iter)3816*67e74705SXin Li   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3817*67e74705SXin Li                                              InputIterator Iter)
3818*67e74705SXin Li     : Self(Self), Iter(Iter) { }
3819*67e74705SXin Li 
3820*67e74705SXin Li   TemplateArgumentLocInventIterator &operator++() {
3821*67e74705SXin Li     ++Iter;
3822*67e74705SXin Li     return *this;
3823*67e74705SXin Li   }
3824*67e74705SXin Li 
3825*67e74705SXin Li   TemplateArgumentLocInventIterator operator++(int) {
3826*67e74705SXin Li     TemplateArgumentLocInventIterator Old(*this);
3827*67e74705SXin Li     ++(*this);
3828*67e74705SXin Li     return Old;
3829*67e74705SXin Li   }
3830*67e74705SXin Li 
3831*67e74705SXin Li   reference operator*() const {
3832*67e74705SXin Li     TemplateArgumentLoc Result;
3833*67e74705SXin Li     Self.InventTemplateArgumentLoc(*Iter, Result);
3834*67e74705SXin Li     return Result;
3835*67e74705SXin Li   }
3836*67e74705SXin Li 
3837*67e74705SXin Li   pointer operator->() const { return pointer(**this); }
3838*67e74705SXin Li 
3839*67e74705SXin Li   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3840*67e74705SXin Li                          const TemplateArgumentLocInventIterator &Y) {
3841*67e74705SXin Li     return X.Iter == Y.Iter;
3842*67e74705SXin Li   }
3843*67e74705SXin Li 
3844*67e74705SXin Li   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3845*67e74705SXin Li                          const TemplateArgumentLocInventIterator &Y) {
3846*67e74705SXin Li     return X.Iter != Y.Iter;
3847*67e74705SXin Li   }
3848*67e74705SXin Li };
3849*67e74705SXin Li 
3850*67e74705SXin Li template<typename Derived>
3851*67e74705SXin Li template<typename InputIterator>
TransformTemplateArguments(InputIterator First,InputIterator Last,TemplateArgumentListInfo & Outputs,bool Uneval)3852*67e74705SXin Li bool TreeTransform<Derived>::TransformTemplateArguments(
3853*67e74705SXin Li     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3854*67e74705SXin Li     bool Uneval) {
3855*67e74705SXin Li   for (; First != Last; ++First) {
3856*67e74705SXin Li     TemplateArgumentLoc Out;
3857*67e74705SXin Li     TemplateArgumentLoc In = *First;
3858*67e74705SXin Li 
3859*67e74705SXin Li     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3860*67e74705SXin Li       // Unpack argument packs, which we translate them into separate
3861*67e74705SXin Li       // arguments.
3862*67e74705SXin Li       // FIXME: We could do much better if we could guarantee that the
3863*67e74705SXin Li       // TemplateArgumentLocInfo for the pack expansion would be usable for
3864*67e74705SXin Li       // all of the template arguments in the argument pack.
3865*67e74705SXin Li       typedef TemplateArgumentLocInventIterator<Derived,
3866*67e74705SXin Li                                                 TemplateArgument::pack_iterator>
3867*67e74705SXin Li         PackLocIterator;
3868*67e74705SXin Li       if (TransformTemplateArguments(PackLocIterator(*this,
3869*67e74705SXin Li                                                  In.getArgument().pack_begin()),
3870*67e74705SXin Li                                      PackLocIterator(*this,
3871*67e74705SXin Li                                                    In.getArgument().pack_end()),
3872*67e74705SXin Li                                      Outputs, Uneval))
3873*67e74705SXin Li         return true;
3874*67e74705SXin Li 
3875*67e74705SXin Li       continue;
3876*67e74705SXin Li     }
3877*67e74705SXin Li 
3878*67e74705SXin Li     if (In.getArgument().isPackExpansion()) {
3879*67e74705SXin Li       // We have a pack expansion, for which we will be substituting into
3880*67e74705SXin Li       // the pattern.
3881*67e74705SXin Li       SourceLocation Ellipsis;
3882*67e74705SXin Li       Optional<unsigned> OrigNumExpansions;
3883*67e74705SXin Li       TemplateArgumentLoc Pattern
3884*67e74705SXin Li         = getSema().getTemplateArgumentPackExpansionPattern(
3885*67e74705SXin Li               In, Ellipsis, OrigNumExpansions);
3886*67e74705SXin Li 
3887*67e74705SXin Li       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3888*67e74705SXin Li       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3889*67e74705SXin Li       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3890*67e74705SXin Li 
3891*67e74705SXin Li       // Determine whether the set of unexpanded parameter packs can and should
3892*67e74705SXin Li       // be expanded.
3893*67e74705SXin Li       bool Expand = true;
3894*67e74705SXin Li       bool RetainExpansion = false;
3895*67e74705SXin Li       Optional<unsigned> NumExpansions = OrigNumExpansions;
3896*67e74705SXin Li       if (getDerived().TryExpandParameterPacks(Ellipsis,
3897*67e74705SXin Li                                                Pattern.getSourceRange(),
3898*67e74705SXin Li                                                Unexpanded,
3899*67e74705SXin Li                                                Expand,
3900*67e74705SXin Li                                                RetainExpansion,
3901*67e74705SXin Li                                                NumExpansions))
3902*67e74705SXin Li         return true;
3903*67e74705SXin Li 
3904*67e74705SXin Li       if (!Expand) {
3905*67e74705SXin Li         // The transform has determined that we should perform a simple
3906*67e74705SXin Li         // transformation on the pack expansion, producing another pack
3907*67e74705SXin Li         // expansion.
3908*67e74705SXin Li         TemplateArgumentLoc OutPattern;
3909*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3910*67e74705SXin Li         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
3911*67e74705SXin Li           return true;
3912*67e74705SXin Li 
3913*67e74705SXin Li         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3914*67e74705SXin Li                                                 NumExpansions);
3915*67e74705SXin Li         if (Out.getArgument().isNull())
3916*67e74705SXin Li           return true;
3917*67e74705SXin Li 
3918*67e74705SXin Li         Outputs.addArgument(Out);
3919*67e74705SXin Li         continue;
3920*67e74705SXin Li       }
3921*67e74705SXin Li 
3922*67e74705SXin Li       // The transform has determined that we should perform an elementwise
3923*67e74705SXin Li       // expansion of the pattern. Do so.
3924*67e74705SXin Li       for (unsigned I = 0; I != *NumExpansions; ++I) {
3925*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3926*67e74705SXin Li 
3927*67e74705SXin Li         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
3928*67e74705SXin Li           return true;
3929*67e74705SXin Li 
3930*67e74705SXin Li         if (Out.getArgument().containsUnexpandedParameterPack()) {
3931*67e74705SXin Li           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3932*67e74705SXin Li                                                   OrigNumExpansions);
3933*67e74705SXin Li           if (Out.getArgument().isNull())
3934*67e74705SXin Li             return true;
3935*67e74705SXin Li         }
3936*67e74705SXin Li 
3937*67e74705SXin Li         Outputs.addArgument(Out);
3938*67e74705SXin Li       }
3939*67e74705SXin Li 
3940*67e74705SXin Li       // If we're supposed to retain a pack expansion, do so by temporarily
3941*67e74705SXin Li       // forgetting the partially-substituted parameter pack.
3942*67e74705SXin Li       if (RetainExpansion) {
3943*67e74705SXin Li         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3944*67e74705SXin Li 
3945*67e74705SXin Li         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
3946*67e74705SXin Li           return true;
3947*67e74705SXin Li 
3948*67e74705SXin Li         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3949*67e74705SXin Li                                                 OrigNumExpansions);
3950*67e74705SXin Li         if (Out.getArgument().isNull())
3951*67e74705SXin Li           return true;
3952*67e74705SXin Li 
3953*67e74705SXin Li         Outputs.addArgument(Out);
3954*67e74705SXin Li       }
3955*67e74705SXin Li 
3956*67e74705SXin Li       continue;
3957*67e74705SXin Li     }
3958*67e74705SXin Li 
3959*67e74705SXin Li     // The simple case:
3960*67e74705SXin Li     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
3961*67e74705SXin Li       return true;
3962*67e74705SXin Li 
3963*67e74705SXin Li     Outputs.addArgument(Out);
3964*67e74705SXin Li   }
3965*67e74705SXin Li 
3966*67e74705SXin Li   return false;
3967*67e74705SXin Li 
3968*67e74705SXin Li }
3969*67e74705SXin Li 
3970*67e74705SXin Li //===----------------------------------------------------------------------===//
3971*67e74705SXin Li // Type transformation
3972*67e74705SXin Li //===----------------------------------------------------------------------===//
3973*67e74705SXin Li 
3974*67e74705SXin Li template<typename Derived>
TransformType(QualType T)3975*67e74705SXin Li QualType TreeTransform<Derived>::TransformType(QualType T) {
3976*67e74705SXin Li   if (getDerived().AlreadyTransformed(T))
3977*67e74705SXin Li     return T;
3978*67e74705SXin Li 
3979*67e74705SXin Li   // Temporary workaround.  All of these transformations should
3980*67e74705SXin Li   // eventually turn into transformations on TypeLocs.
3981*67e74705SXin Li   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3982*67e74705SXin Li                                                 getDerived().getBaseLocation());
3983*67e74705SXin Li 
3984*67e74705SXin Li   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3985*67e74705SXin Li 
3986*67e74705SXin Li   if (!NewDI)
3987*67e74705SXin Li     return QualType();
3988*67e74705SXin Li 
3989*67e74705SXin Li   return NewDI->getType();
3990*67e74705SXin Li }
3991*67e74705SXin Li 
3992*67e74705SXin Li template<typename Derived>
TransformType(TypeSourceInfo * DI)3993*67e74705SXin Li TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3994*67e74705SXin Li   // Refine the base location to the type's location.
3995*67e74705SXin Li   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
3996*67e74705SXin Li                        getDerived().getBaseEntity());
3997*67e74705SXin Li   if (getDerived().AlreadyTransformed(DI->getType()))
3998*67e74705SXin Li     return DI;
3999*67e74705SXin Li 
4000*67e74705SXin Li   TypeLocBuilder TLB;
4001*67e74705SXin Li 
4002*67e74705SXin Li   TypeLoc TL = DI->getTypeLoc();
4003*67e74705SXin Li   TLB.reserve(TL.getFullDataSize());
4004*67e74705SXin Li 
4005*67e74705SXin Li   QualType Result = getDerived().TransformType(TLB, TL);
4006*67e74705SXin Li   if (Result.isNull())
4007*67e74705SXin Li     return nullptr;
4008*67e74705SXin Li 
4009*67e74705SXin Li   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4010*67e74705SXin Li }
4011*67e74705SXin Li 
4012*67e74705SXin Li template<typename Derived>
4013*67e74705SXin Li QualType
TransformType(TypeLocBuilder & TLB,TypeLoc T)4014*67e74705SXin Li TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4015*67e74705SXin Li   switch (T.getTypeLocClass()) {
4016*67e74705SXin Li #define ABSTRACT_TYPELOC(CLASS, PARENT)
4017*67e74705SXin Li #define TYPELOC(CLASS, PARENT)                                                 \
4018*67e74705SXin Li   case TypeLoc::CLASS:                                                         \
4019*67e74705SXin Li     return getDerived().Transform##CLASS##Type(TLB,                            \
4020*67e74705SXin Li                                                T.castAs<CLASS##TypeLoc>());
4021*67e74705SXin Li #include "clang/AST/TypeLocNodes.def"
4022*67e74705SXin Li   }
4023*67e74705SXin Li 
4024*67e74705SXin Li   llvm_unreachable("unhandled type loc!");
4025*67e74705SXin Li }
4026*67e74705SXin Li 
4027*67e74705SXin Li /// FIXME: By default, this routine adds type qualifiers only to types
4028*67e74705SXin Li /// that can have qualifiers, and silently suppresses those qualifiers
4029*67e74705SXin Li /// that are not permitted (e.g., qualifiers on reference or function
4030*67e74705SXin Li /// types). This is the right thing for template instantiation, but
4031*67e74705SXin Li /// probably not for other clients.
4032*67e74705SXin Li template<typename Derived>
4033*67e74705SXin Li QualType
TransformQualifiedType(TypeLocBuilder & TLB,QualifiedTypeLoc T)4034*67e74705SXin Li TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4035*67e74705SXin Li                                                QualifiedTypeLoc T) {
4036*67e74705SXin Li   Qualifiers Quals = T.getType().getLocalQualifiers();
4037*67e74705SXin Li 
4038*67e74705SXin Li   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4039*67e74705SXin Li   if (Result.isNull())
4040*67e74705SXin Li     return QualType();
4041*67e74705SXin Li 
4042*67e74705SXin Li   // Silently suppress qualifiers if the result type can't be qualified.
4043*67e74705SXin Li   // FIXME: this is the right thing for template instantiation, but
4044*67e74705SXin Li   // probably not for other clients.
4045*67e74705SXin Li   if (Result->isFunctionType() || Result->isReferenceType())
4046*67e74705SXin Li     return Result;
4047*67e74705SXin Li 
4048*67e74705SXin Li   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4049*67e74705SXin Li   // resulting type.
4050*67e74705SXin Li   if (Quals.hasObjCLifetime()) {
4051*67e74705SXin Li     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
4052*67e74705SXin Li       Quals.removeObjCLifetime();
4053*67e74705SXin Li     else if (Result.getObjCLifetime()) {
4054*67e74705SXin Li       // Objective-C ARC:
4055*67e74705SXin Li       //   A lifetime qualifier applied to a substituted template parameter
4056*67e74705SXin Li       //   overrides the lifetime qualifier from the template argument.
4057*67e74705SXin Li       const AutoType *AutoTy;
4058*67e74705SXin Li       if (const SubstTemplateTypeParmType *SubstTypeParam
4059*67e74705SXin Li                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
4060*67e74705SXin Li         QualType Replacement = SubstTypeParam->getReplacementType();
4061*67e74705SXin Li         Qualifiers Qs = Replacement.getQualifiers();
4062*67e74705SXin Li         Qs.removeObjCLifetime();
4063*67e74705SXin Li         Replacement
4064*67e74705SXin Li           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
4065*67e74705SXin Li                                              Qs);
4066*67e74705SXin Li         Result = SemaRef.Context.getSubstTemplateTypeParmType(
4067*67e74705SXin Li                                         SubstTypeParam->getReplacedParameter(),
4068*67e74705SXin Li                                                               Replacement);
4069*67e74705SXin Li         TLB.TypeWasModifiedSafely(Result);
4070*67e74705SXin Li       } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
4071*67e74705SXin Li         // 'auto' types behave the same way as template parameters.
4072*67e74705SXin Li         QualType Deduced = AutoTy->getDeducedType();
4073*67e74705SXin Li         Qualifiers Qs = Deduced.getQualifiers();
4074*67e74705SXin Li         Qs.removeObjCLifetime();
4075*67e74705SXin Li         Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
4076*67e74705SXin Li                                                    Qs);
4077*67e74705SXin Li         Result = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4078*67e74705SXin Li                                 AutoTy->isDependentType());
4079*67e74705SXin Li         TLB.TypeWasModifiedSafely(Result);
4080*67e74705SXin Li       } else {
4081*67e74705SXin Li         // Otherwise, complain about the addition of a qualifier to an
4082*67e74705SXin Li         // already-qualified type.
4083*67e74705SXin Li         SourceRange R = T.getUnqualifiedLoc().getSourceRange();
4084*67e74705SXin Li         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
4085*67e74705SXin Li           << Result << R;
4086*67e74705SXin Li 
4087*67e74705SXin Li         Quals.removeObjCLifetime();
4088*67e74705SXin Li       }
4089*67e74705SXin Li     }
4090*67e74705SXin Li   }
4091*67e74705SXin Li   if (!Quals.empty()) {
4092*67e74705SXin Li     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
4093*67e74705SXin Li     // BuildQualifiedType might not add qualifiers if they are invalid.
4094*67e74705SXin Li     if (Result.hasLocalQualifiers())
4095*67e74705SXin Li       TLB.push<QualifiedTypeLoc>(Result);
4096*67e74705SXin Li     // No location information to preserve.
4097*67e74705SXin Li   }
4098*67e74705SXin Li 
4099*67e74705SXin Li   return Result;
4100*67e74705SXin Li }
4101*67e74705SXin Li 
4102*67e74705SXin Li template<typename Derived>
4103*67e74705SXin Li TypeLoc
TransformTypeInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4104*67e74705SXin Li TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4105*67e74705SXin Li                                                    QualType ObjectType,
4106*67e74705SXin Li                                                    NamedDecl *UnqualLookup,
4107*67e74705SXin Li                                                    CXXScopeSpec &SS) {
4108*67e74705SXin Li   if (getDerived().AlreadyTransformed(TL.getType()))
4109*67e74705SXin Li     return TL;
4110*67e74705SXin Li 
4111*67e74705SXin Li   TypeSourceInfo *TSI =
4112*67e74705SXin Li       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4113*67e74705SXin Li   if (TSI)
4114*67e74705SXin Li     return TSI->getTypeLoc();
4115*67e74705SXin Li   return TypeLoc();
4116*67e74705SXin Li }
4117*67e74705SXin Li 
4118*67e74705SXin Li template<typename Derived>
4119*67e74705SXin Li TypeSourceInfo *
TransformTypeInObjectScope(TypeSourceInfo * TSInfo,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4120*67e74705SXin Li TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4121*67e74705SXin Li                                                    QualType ObjectType,
4122*67e74705SXin Li                                                    NamedDecl *UnqualLookup,
4123*67e74705SXin Li                                                    CXXScopeSpec &SS) {
4124*67e74705SXin Li   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4125*67e74705SXin Li     return TSInfo;
4126*67e74705SXin Li 
4127*67e74705SXin Li   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4128*67e74705SXin Li                                    UnqualLookup, SS);
4129*67e74705SXin Li }
4130*67e74705SXin Li 
4131*67e74705SXin Li template <typename Derived>
TransformTSIInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)4132*67e74705SXin Li TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4133*67e74705SXin Li     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4134*67e74705SXin Li     CXXScopeSpec &SS) {
4135*67e74705SXin Li   QualType T = TL.getType();
4136*67e74705SXin Li   assert(!getDerived().AlreadyTransformed(T));
4137*67e74705SXin Li 
4138*67e74705SXin Li   TypeLocBuilder TLB;
4139*67e74705SXin Li   QualType Result;
4140*67e74705SXin Li 
4141*67e74705SXin Li   if (isa<TemplateSpecializationType>(T)) {
4142*67e74705SXin Li     TemplateSpecializationTypeLoc SpecTL =
4143*67e74705SXin Li         TL.castAs<TemplateSpecializationTypeLoc>();
4144*67e74705SXin Li 
4145*67e74705SXin Li     TemplateName Template
4146*67e74705SXin Li     = getDerived().TransformTemplateName(SS,
4147*67e74705SXin Li                                          SpecTL.getTypePtr()->getTemplateName(),
4148*67e74705SXin Li                                          SpecTL.getTemplateNameLoc(),
4149*67e74705SXin Li                                          ObjectType, UnqualLookup);
4150*67e74705SXin Li     if (Template.isNull())
4151*67e74705SXin Li       return nullptr;
4152*67e74705SXin Li 
4153*67e74705SXin Li     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4154*67e74705SXin Li                                                               Template);
4155*67e74705SXin Li   } else if (isa<DependentTemplateSpecializationType>(T)) {
4156*67e74705SXin Li     DependentTemplateSpecializationTypeLoc SpecTL =
4157*67e74705SXin Li         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4158*67e74705SXin Li 
4159*67e74705SXin Li     TemplateName Template
4160*67e74705SXin Li       = getDerived().RebuildTemplateName(SS,
4161*67e74705SXin Li                                          *SpecTL.getTypePtr()->getIdentifier(),
4162*67e74705SXin Li                                          SpecTL.getTemplateNameLoc(),
4163*67e74705SXin Li                                          ObjectType, UnqualLookup);
4164*67e74705SXin Li     if (Template.isNull())
4165*67e74705SXin Li       return nullptr;
4166*67e74705SXin Li 
4167*67e74705SXin Li     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4168*67e74705SXin Li                                                                        SpecTL,
4169*67e74705SXin Li                                                                        Template,
4170*67e74705SXin Li                                                                        SS);
4171*67e74705SXin Li   } else {
4172*67e74705SXin Li     // Nothing special needs to be done for these.
4173*67e74705SXin Li     Result = getDerived().TransformType(TLB, TL);
4174*67e74705SXin Li   }
4175*67e74705SXin Li 
4176*67e74705SXin Li   if (Result.isNull())
4177*67e74705SXin Li     return nullptr;
4178*67e74705SXin Li 
4179*67e74705SXin Li   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4180*67e74705SXin Li }
4181*67e74705SXin Li 
4182*67e74705SXin Li template <class TyLoc> static inline
TransformTypeSpecType(TypeLocBuilder & TLB,TyLoc T)4183*67e74705SXin Li QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4184*67e74705SXin Li   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4185*67e74705SXin Li   NewT.setNameLoc(T.getNameLoc());
4186*67e74705SXin Li   return T.getType();
4187*67e74705SXin Li }
4188*67e74705SXin Li 
4189*67e74705SXin Li template<typename Derived>
TransformBuiltinType(TypeLocBuilder & TLB,BuiltinTypeLoc T)4190*67e74705SXin Li QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4191*67e74705SXin Li                                                       BuiltinTypeLoc T) {
4192*67e74705SXin Li   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4193*67e74705SXin Li   NewT.setBuiltinLoc(T.getBuiltinLoc());
4194*67e74705SXin Li   if (T.needsExtraLocalData())
4195*67e74705SXin Li     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4196*67e74705SXin Li   return T.getType();
4197*67e74705SXin Li }
4198*67e74705SXin Li 
4199*67e74705SXin Li template<typename Derived>
TransformComplexType(TypeLocBuilder & TLB,ComplexTypeLoc T)4200*67e74705SXin Li QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4201*67e74705SXin Li                                                       ComplexTypeLoc T) {
4202*67e74705SXin Li   // FIXME: recurse?
4203*67e74705SXin Li   return TransformTypeSpecType(TLB, T);
4204*67e74705SXin Li }
4205*67e74705SXin Li 
4206*67e74705SXin Li template <typename Derived>
TransformAdjustedType(TypeLocBuilder & TLB,AdjustedTypeLoc TL)4207*67e74705SXin Li QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4208*67e74705SXin Li                                                        AdjustedTypeLoc TL) {
4209*67e74705SXin Li   // Adjustments applied during transformation are handled elsewhere.
4210*67e74705SXin Li   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4211*67e74705SXin Li }
4212*67e74705SXin Li 
4213*67e74705SXin Li template<typename Derived>
TransformDecayedType(TypeLocBuilder & TLB,DecayedTypeLoc TL)4214*67e74705SXin Li QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4215*67e74705SXin Li                                                       DecayedTypeLoc TL) {
4216*67e74705SXin Li   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4217*67e74705SXin Li   if (OriginalType.isNull())
4218*67e74705SXin Li     return QualType();
4219*67e74705SXin Li 
4220*67e74705SXin Li   QualType Result = TL.getType();
4221*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4222*67e74705SXin Li       OriginalType != TL.getOriginalLoc().getType())
4223*67e74705SXin Li     Result = SemaRef.Context.getDecayedType(OriginalType);
4224*67e74705SXin Li   TLB.push<DecayedTypeLoc>(Result);
4225*67e74705SXin Li   // Nothing to set for DecayedTypeLoc.
4226*67e74705SXin Li   return Result;
4227*67e74705SXin Li }
4228*67e74705SXin Li 
4229*67e74705SXin Li template<typename Derived>
TransformPointerType(TypeLocBuilder & TLB,PointerTypeLoc TL)4230*67e74705SXin Li QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4231*67e74705SXin Li                                                       PointerTypeLoc TL) {
4232*67e74705SXin Li   QualType PointeeType
4233*67e74705SXin Li     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4234*67e74705SXin Li   if (PointeeType.isNull())
4235*67e74705SXin Li     return QualType();
4236*67e74705SXin Li 
4237*67e74705SXin Li   QualType Result = TL.getType();
4238*67e74705SXin Li   if (PointeeType->getAs<ObjCObjectType>()) {
4239*67e74705SXin Li     // A dependent pointer type 'T *' has is being transformed such
4240*67e74705SXin Li     // that an Objective-C class type is being replaced for 'T'. The
4241*67e74705SXin Li     // resulting pointer type is an ObjCObjectPointerType, not a
4242*67e74705SXin Li     // PointerType.
4243*67e74705SXin Li     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4244*67e74705SXin Li 
4245*67e74705SXin Li     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4246*67e74705SXin Li     NewT.setStarLoc(TL.getStarLoc());
4247*67e74705SXin Li     return Result;
4248*67e74705SXin Li   }
4249*67e74705SXin Li 
4250*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4251*67e74705SXin Li       PointeeType != TL.getPointeeLoc().getType()) {
4252*67e74705SXin Li     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4253*67e74705SXin Li     if (Result.isNull())
4254*67e74705SXin Li       return QualType();
4255*67e74705SXin Li   }
4256*67e74705SXin Li 
4257*67e74705SXin Li   // Objective-C ARC can add lifetime qualifiers to the type that we're
4258*67e74705SXin Li   // pointing to.
4259*67e74705SXin Li   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4260*67e74705SXin Li 
4261*67e74705SXin Li   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4262*67e74705SXin Li   NewT.setSigilLoc(TL.getSigilLoc());
4263*67e74705SXin Li   return Result;
4264*67e74705SXin Li }
4265*67e74705SXin Li 
4266*67e74705SXin Li template<typename Derived>
4267*67e74705SXin Li QualType
TransformBlockPointerType(TypeLocBuilder & TLB,BlockPointerTypeLoc TL)4268*67e74705SXin Li TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4269*67e74705SXin Li                                                   BlockPointerTypeLoc TL) {
4270*67e74705SXin Li   QualType PointeeType
4271*67e74705SXin Li     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4272*67e74705SXin Li   if (PointeeType.isNull())
4273*67e74705SXin Li     return QualType();
4274*67e74705SXin Li 
4275*67e74705SXin Li   QualType Result = TL.getType();
4276*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4277*67e74705SXin Li       PointeeType != TL.getPointeeLoc().getType()) {
4278*67e74705SXin Li     Result = getDerived().RebuildBlockPointerType(PointeeType,
4279*67e74705SXin Li                                                   TL.getSigilLoc());
4280*67e74705SXin Li     if (Result.isNull())
4281*67e74705SXin Li       return QualType();
4282*67e74705SXin Li   }
4283*67e74705SXin Li 
4284*67e74705SXin Li   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4285*67e74705SXin Li   NewT.setSigilLoc(TL.getSigilLoc());
4286*67e74705SXin Li   return Result;
4287*67e74705SXin Li }
4288*67e74705SXin Li 
4289*67e74705SXin Li /// Transforms a reference type.  Note that somewhat paradoxically we
4290*67e74705SXin Li /// don't care whether the type itself is an l-value type or an r-value
4291*67e74705SXin Li /// type;  we only care if the type was *written* as an l-value type
4292*67e74705SXin Li /// or an r-value type.
4293*67e74705SXin Li template<typename Derived>
4294*67e74705SXin Li QualType
TransformReferenceType(TypeLocBuilder & TLB,ReferenceTypeLoc TL)4295*67e74705SXin Li TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4296*67e74705SXin Li                                                ReferenceTypeLoc TL) {
4297*67e74705SXin Li   const ReferenceType *T = TL.getTypePtr();
4298*67e74705SXin Li 
4299*67e74705SXin Li   // Note that this works with the pointee-as-written.
4300*67e74705SXin Li   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4301*67e74705SXin Li   if (PointeeType.isNull())
4302*67e74705SXin Li     return QualType();
4303*67e74705SXin Li 
4304*67e74705SXin Li   QualType Result = TL.getType();
4305*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4306*67e74705SXin Li       PointeeType != T->getPointeeTypeAsWritten()) {
4307*67e74705SXin Li     Result = getDerived().RebuildReferenceType(PointeeType,
4308*67e74705SXin Li                                                T->isSpelledAsLValue(),
4309*67e74705SXin Li                                                TL.getSigilLoc());
4310*67e74705SXin Li     if (Result.isNull())
4311*67e74705SXin Li       return QualType();
4312*67e74705SXin Li   }
4313*67e74705SXin Li 
4314*67e74705SXin Li   // Objective-C ARC can add lifetime qualifiers to the type that we're
4315*67e74705SXin Li   // referring to.
4316*67e74705SXin Li   TLB.TypeWasModifiedSafely(
4317*67e74705SXin Li                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4318*67e74705SXin Li 
4319*67e74705SXin Li   // r-value references can be rebuilt as l-value references.
4320*67e74705SXin Li   ReferenceTypeLoc NewTL;
4321*67e74705SXin Li   if (isa<LValueReferenceType>(Result))
4322*67e74705SXin Li     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4323*67e74705SXin Li   else
4324*67e74705SXin Li     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4325*67e74705SXin Li   NewTL.setSigilLoc(TL.getSigilLoc());
4326*67e74705SXin Li 
4327*67e74705SXin Li   return Result;
4328*67e74705SXin Li }
4329*67e74705SXin Li 
4330*67e74705SXin Li template<typename Derived>
4331*67e74705SXin Li QualType
TransformLValueReferenceType(TypeLocBuilder & TLB,LValueReferenceTypeLoc TL)4332*67e74705SXin Li TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4333*67e74705SXin Li                                                  LValueReferenceTypeLoc TL) {
4334*67e74705SXin Li   return TransformReferenceType(TLB, TL);
4335*67e74705SXin Li }
4336*67e74705SXin Li 
4337*67e74705SXin Li template<typename Derived>
4338*67e74705SXin Li QualType
TransformRValueReferenceType(TypeLocBuilder & TLB,RValueReferenceTypeLoc TL)4339*67e74705SXin Li TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4340*67e74705SXin Li                                                  RValueReferenceTypeLoc TL) {
4341*67e74705SXin Li   return TransformReferenceType(TLB, TL);
4342*67e74705SXin Li }
4343*67e74705SXin Li 
4344*67e74705SXin Li template<typename Derived>
4345*67e74705SXin Li QualType
TransformMemberPointerType(TypeLocBuilder & TLB,MemberPointerTypeLoc TL)4346*67e74705SXin Li TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4347*67e74705SXin Li                                                    MemberPointerTypeLoc TL) {
4348*67e74705SXin Li   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4349*67e74705SXin Li   if (PointeeType.isNull())
4350*67e74705SXin Li     return QualType();
4351*67e74705SXin Li 
4352*67e74705SXin Li   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4353*67e74705SXin Li   TypeSourceInfo *NewClsTInfo = nullptr;
4354*67e74705SXin Li   if (OldClsTInfo) {
4355*67e74705SXin Li     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4356*67e74705SXin Li     if (!NewClsTInfo)
4357*67e74705SXin Li       return QualType();
4358*67e74705SXin Li   }
4359*67e74705SXin Li 
4360*67e74705SXin Li   const MemberPointerType *T = TL.getTypePtr();
4361*67e74705SXin Li   QualType OldClsType = QualType(T->getClass(), 0);
4362*67e74705SXin Li   QualType NewClsType;
4363*67e74705SXin Li   if (NewClsTInfo)
4364*67e74705SXin Li     NewClsType = NewClsTInfo->getType();
4365*67e74705SXin Li   else {
4366*67e74705SXin Li     NewClsType = getDerived().TransformType(OldClsType);
4367*67e74705SXin Li     if (NewClsType.isNull())
4368*67e74705SXin Li       return QualType();
4369*67e74705SXin Li   }
4370*67e74705SXin Li 
4371*67e74705SXin Li   QualType Result = TL.getType();
4372*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4373*67e74705SXin Li       PointeeType != T->getPointeeType() ||
4374*67e74705SXin Li       NewClsType != OldClsType) {
4375*67e74705SXin Li     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4376*67e74705SXin Li                                                    TL.getStarLoc());
4377*67e74705SXin Li     if (Result.isNull())
4378*67e74705SXin Li       return QualType();
4379*67e74705SXin Li   }
4380*67e74705SXin Li 
4381*67e74705SXin Li   // If we had to adjust the pointee type when building a member pointer, make
4382*67e74705SXin Li   // sure to push TypeLoc info for it.
4383*67e74705SXin Li   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4384*67e74705SXin Li   if (MPT && PointeeType != MPT->getPointeeType()) {
4385*67e74705SXin Li     assert(isa<AdjustedType>(MPT->getPointeeType()));
4386*67e74705SXin Li     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4387*67e74705SXin Li   }
4388*67e74705SXin Li 
4389*67e74705SXin Li   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4390*67e74705SXin Li   NewTL.setSigilLoc(TL.getSigilLoc());
4391*67e74705SXin Li   NewTL.setClassTInfo(NewClsTInfo);
4392*67e74705SXin Li 
4393*67e74705SXin Li   return Result;
4394*67e74705SXin Li }
4395*67e74705SXin Li 
4396*67e74705SXin Li template<typename Derived>
4397*67e74705SXin Li QualType
TransformConstantArrayType(TypeLocBuilder & TLB,ConstantArrayTypeLoc TL)4398*67e74705SXin Li TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4399*67e74705SXin Li                                                    ConstantArrayTypeLoc TL) {
4400*67e74705SXin Li   const ConstantArrayType *T = TL.getTypePtr();
4401*67e74705SXin Li   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4402*67e74705SXin Li   if (ElementType.isNull())
4403*67e74705SXin Li     return QualType();
4404*67e74705SXin Li 
4405*67e74705SXin Li   QualType Result = TL.getType();
4406*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4407*67e74705SXin Li       ElementType != T->getElementType()) {
4408*67e74705SXin Li     Result = getDerived().RebuildConstantArrayType(ElementType,
4409*67e74705SXin Li                                                    T->getSizeModifier(),
4410*67e74705SXin Li                                                    T->getSize(),
4411*67e74705SXin Li                                              T->getIndexTypeCVRQualifiers(),
4412*67e74705SXin Li                                                    TL.getBracketsRange());
4413*67e74705SXin Li     if (Result.isNull())
4414*67e74705SXin Li       return QualType();
4415*67e74705SXin Li   }
4416*67e74705SXin Li 
4417*67e74705SXin Li   // We might have either a ConstantArrayType or a VariableArrayType now:
4418*67e74705SXin Li   // a ConstantArrayType is allowed to have an element type which is a
4419*67e74705SXin Li   // VariableArrayType if the type is dependent.  Fortunately, all array
4420*67e74705SXin Li   // types have the same location layout.
4421*67e74705SXin Li   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4422*67e74705SXin Li   NewTL.setLBracketLoc(TL.getLBracketLoc());
4423*67e74705SXin Li   NewTL.setRBracketLoc(TL.getRBracketLoc());
4424*67e74705SXin Li 
4425*67e74705SXin Li   Expr *Size = TL.getSizeExpr();
4426*67e74705SXin Li   if (Size) {
4427*67e74705SXin Li     EnterExpressionEvaluationContext Unevaluated(SemaRef,
4428*67e74705SXin Li                                                  Sema::ConstantEvaluated);
4429*67e74705SXin Li     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4430*67e74705SXin Li     Size = SemaRef.ActOnConstantExpression(Size).get();
4431*67e74705SXin Li   }
4432*67e74705SXin Li   NewTL.setSizeExpr(Size);
4433*67e74705SXin Li 
4434*67e74705SXin Li   return Result;
4435*67e74705SXin Li }
4436*67e74705SXin Li 
4437*67e74705SXin Li template<typename Derived>
TransformIncompleteArrayType(TypeLocBuilder & TLB,IncompleteArrayTypeLoc TL)4438*67e74705SXin Li QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4439*67e74705SXin Li                                               TypeLocBuilder &TLB,
4440*67e74705SXin Li                                               IncompleteArrayTypeLoc TL) {
4441*67e74705SXin Li   const IncompleteArrayType *T = TL.getTypePtr();
4442*67e74705SXin Li   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4443*67e74705SXin Li   if (ElementType.isNull())
4444*67e74705SXin Li     return QualType();
4445*67e74705SXin Li 
4446*67e74705SXin Li   QualType Result = TL.getType();
4447*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4448*67e74705SXin Li       ElementType != T->getElementType()) {
4449*67e74705SXin Li     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4450*67e74705SXin Li                                                      T->getSizeModifier(),
4451*67e74705SXin Li                                            T->getIndexTypeCVRQualifiers(),
4452*67e74705SXin Li                                                      TL.getBracketsRange());
4453*67e74705SXin Li     if (Result.isNull())
4454*67e74705SXin Li       return QualType();
4455*67e74705SXin Li   }
4456*67e74705SXin Li 
4457*67e74705SXin Li   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4458*67e74705SXin Li   NewTL.setLBracketLoc(TL.getLBracketLoc());
4459*67e74705SXin Li   NewTL.setRBracketLoc(TL.getRBracketLoc());
4460*67e74705SXin Li   NewTL.setSizeExpr(nullptr);
4461*67e74705SXin Li 
4462*67e74705SXin Li   return Result;
4463*67e74705SXin Li }
4464*67e74705SXin Li 
4465*67e74705SXin Li template<typename Derived>
4466*67e74705SXin Li QualType
TransformVariableArrayType(TypeLocBuilder & TLB,VariableArrayTypeLoc TL)4467*67e74705SXin Li TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4468*67e74705SXin Li                                                    VariableArrayTypeLoc TL) {
4469*67e74705SXin Li   const VariableArrayType *T = TL.getTypePtr();
4470*67e74705SXin Li   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4471*67e74705SXin Li   if (ElementType.isNull())
4472*67e74705SXin Li     return QualType();
4473*67e74705SXin Li 
4474*67e74705SXin Li   ExprResult SizeResult
4475*67e74705SXin Li     = getDerived().TransformExpr(T->getSizeExpr());
4476*67e74705SXin Li   if (SizeResult.isInvalid())
4477*67e74705SXin Li     return QualType();
4478*67e74705SXin Li 
4479*67e74705SXin Li   Expr *Size = SizeResult.get();
4480*67e74705SXin Li 
4481*67e74705SXin Li   QualType Result = TL.getType();
4482*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4483*67e74705SXin Li       ElementType != T->getElementType() ||
4484*67e74705SXin Li       Size != T->getSizeExpr()) {
4485*67e74705SXin Li     Result = getDerived().RebuildVariableArrayType(ElementType,
4486*67e74705SXin Li                                                    T->getSizeModifier(),
4487*67e74705SXin Li                                                    Size,
4488*67e74705SXin Li                                              T->getIndexTypeCVRQualifiers(),
4489*67e74705SXin Li                                                    TL.getBracketsRange());
4490*67e74705SXin Li     if (Result.isNull())
4491*67e74705SXin Li       return QualType();
4492*67e74705SXin Li   }
4493*67e74705SXin Li 
4494*67e74705SXin Li   // We might have constant size array now, but fortunately it has the same
4495*67e74705SXin Li   // location layout.
4496*67e74705SXin Li   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4497*67e74705SXin Li   NewTL.setLBracketLoc(TL.getLBracketLoc());
4498*67e74705SXin Li   NewTL.setRBracketLoc(TL.getRBracketLoc());
4499*67e74705SXin Li   NewTL.setSizeExpr(Size);
4500*67e74705SXin Li 
4501*67e74705SXin Li   return Result;
4502*67e74705SXin Li }
4503*67e74705SXin Li 
4504*67e74705SXin Li template<typename Derived>
4505*67e74705SXin Li QualType
TransformDependentSizedArrayType(TypeLocBuilder & TLB,DependentSizedArrayTypeLoc TL)4506*67e74705SXin Li TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4507*67e74705SXin Li                                              DependentSizedArrayTypeLoc TL) {
4508*67e74705SXin Li   const DependentSizedArrayType *T = TL.getTypePtr();
4509*67e74705SXin Li   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4510*67e74705SXin Li   if (ElementType.isNull())
4511*67e74705SXin Li     return QualType();
4512*67e74705SXin Li 
4513*67e74705SXin Li   // Array bounds are constant expressions.
4514*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4515*67e74705SXin Li                                                Sema::ConstantEvaluated);
4516*67e74705SXin Li 
4517*67e74705SXin Li   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4518*67e74705SXin Li   Expr *origSize = TL.getSizeExpr();
4519*67e74705SXin Li   if (!origSize) origSize = T->getSizeExpr();
4520*67e74705SXin Li 
4521*67e74705SXin Li   ExprResult sizeResult
4522*67e74705SXin Li     = getDerived().TransformExpr(origSize);
4523*67e74705SXin Li   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4524*67e74705SXin Li   if (sizeResult.isInvalid())
4525*67e74705SXin Li     return QualType();
4526*67e74705SXin Li 
4527*67e74705SXin Li   Expr *size = sizeResult.get();
4528*67e74705SXin Li 
4529*67e74705SXin Li   QualType Result = TL.getType();
4530*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4531*67e74705SXin Li       ElementType != T->getElementType() ||
4532*67e74705SXin Li       size != origSize) {
4533*67e74705SXin Li     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4534*67e74705SXin Li                                                          T->getSizeModifier(),
4535*67e74705SXin Li                                                          size,
4536*67e74705SXin Li                                                 T->getIndexTypeCVRQualifiers(),
4537*67e74705SXin Li                                                         TL.getBracketsRange());
4538*67e74705SXin Li     if (Result.isNull())
4539*67e74705SXin Li       return QualType();
4540*67e74705SXin Li   }
4541*67e74705SXin Li 
4542*67e74705SXin Li   // We might have any sort of array type now, but fortunately they
4543*67e74705SXin Li   // all have the same location layout.
4544*67e74705SXin Li   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4545*67e74705SXin Li   NewTL.setLBracketLoc(TL.getLBracketLoc());
4546*67e74705SXin Li   NewTL.setRBracketLoc(TL.getRBracketLoc());
4547*67e74705SXin Li   NewTL.setSizeExpr(size);
4548*67e74705SXin Li 
4549*67e74705SXin Li   return Result;
4550*67e74705SXin Li }
4551*67e74705SXin Li 
4552*67e74705SXin Li template<typename Derived>
TransformDependentSizedExtVectorType(TypeLocBuilder & TLB,DependentSizedExtVectorTypeLoc TL)4553*67e74705SXin Li QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4554*67e74705SXin Li                                       TypeLocBuilder &TLB,
4555*67e74705SXin Li                                       DependentSizedExtVectorTypeLoc TL) {
4556*67e74705SXin Li   const DependentSizedExtVectorType *T = TL.getTypePtr();
4557*67e74705SXin Li 
4558*67e74705SXin Li   // FIXME: ext vector locs should be nested
4559*67e74705SXin Li   QualType ElementType = getDerived().TransformType(T->getElementType());
4560*67e74705SXin Li   if (ElementType.isNull())
4561*67e74705SXin Li     return QualType();
4562*67e74705SXin Li 
4563*67e74705SXin Li   // Vector sizes are constant expressions.
4564*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4565*67e74705SXin Li                                                Sema::ConstantEvaluated);
4566*67e74705SXin Li 
4567*67e74705SXin Li   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4568*67e74705SXin Li   Size = SemaRef.ActOnConstantExpression(Size);
4569*67e74705SXin Li   if (Size.isInvalid())
4570*67e74705SXin Li     return QualType();
4571*67e74705SXin Li 
4572*67e74705SXin Li   QualType Result = TL.getType();
4573*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4574*67e74705SXin Li       ElementType != T->getElementType() ||
4575*67e74705SXin Li       Size.get() != T->getSizeExpr()) {
4576*67e74705SXin Li     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4577*67e74705SXin Li                                                              Size.get(),
4578*67e74705SXin Li                                                          T->getAttributeLoc());
4579*67e74705SXin Li     if (Result.isNull())
4580*67e74705SXin Li       return QualType();
4581*67e74705SXin Li   }
4582*67e74705SXin Li 
4583*67e74705SXin Li   // Result might be dependent or not.
4584*67e74705SXin Li   if (isa<DependentSizedExtVectorType>(Result)) {
4585*67e74705SXin Li     DependentSizedExtVectorTypeLoc NewTL
4586*67e74705SXin Li       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4587*67e74705SXin Li     NewTL.setNameLoc(TL.getNameLoc());
4588*67e74705SXin Li   } else {
4589*67e74705SXin Li     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4590*67e74705SXin Li     NewTL.setNameLoc(TL.getNameLoc());
4591*67e74705SXin Li   }
4592*67e74705SXin Li 
4593*67e74705SXin Li   return Result;
4594*67e74705SXin Li }
4595*67e74705SXin Li 
4596*67e74705SXin Li template<typename Derived>
TransformVectorType(TypeLocBuilder & TLB,VectorTypeLoc TL)4597*67e74705SXin Li QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4598*67e74705SXin Li                                                      VectorTypeLoc TL) {
4599*67e74705SXin Li   const VectorType *T = TL.getTypePtr();
4600*67e74705SXin Li   QualType ElementType = getDerived().TransformType(T->getElementType());
4601*67e74705SXin Li   if (ElementType.isNull())
4602*67e74705SXin Li     return QualType();
4603*67e74705SXin Li 
4604*67e74705SXin Li   QualType Result = TL.getType();
4605*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4606*67e74705SXin Li       ElementType != T->getElementType()) {
4607*67e74705SXin Li     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4608*67e74705SXin Li                                             T->getVectorKind());
4609*67e74705SXin Li     if (Result.isNull())
4610*67e74705SXin Li       return QualType();
4611*67e74705SXin Li   }
4612*67e74705SXin Li 
4613*67e74705SXin Li   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4614*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
4615*67e74705SXin Li 
4616*67e74705SXin Li   return Result;
4617*67e74705SXin Li }
4618*67e74705SXin Li 
4619*67e74705SXin Li template<typename Derived>
TransformExtVectorType(TypeLocBuilder & TLB,ExtVectorTypeLoc TL)4620*67e74705SXin Li QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4621*67e74705SXin Li                                                         ExtVectorTypeLoc TL) {
4622*67e74705SXin Li   const VectorType *T = TL.getTypePtr();
4623*67e74705SXin Li   QualType ElementType = getDerived().TransformType(T->getElementType());
4624*67e74705SXin Li   if (ElementType.isNull())
4625*67e74705SXin Li     return QualType();
4626*67e74705SXin Li 
4627*67e74705SXin Li   QualType Result = TL.getType();
4628*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
4629*67e74705SXin Li       ElementType != T->getElementType()) {
4630*67e74705SXin Li     Result = getDerived().RebuildExtVectorType(ElementType,
4631*67e74705SXin Li                                                T->getNumElements(),
4632*67e74705SXin Li                                                /*FIXME*/ SourceLocation());
4633*67e74705SXin Li     if (Result.isNull())
4634*67e74705SXin Li       return QualType();
4635*67e74705SXin Li   }
4636*67e74705SXin Li 
4637*67e74705SXin Li   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4638*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
4639*67e74705SXin Li 
4640*67e74705SXin Li   return Result;
4641*67e74705SXin Li }
4642*67e74705SXin Li 
4643*67e74705SXin Li template <typename Derived>
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,Optional<unsigned> NumExpansions,bool ExpectParameterPack)4644*67e74705SXin Li ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4645*67e74705SXin Li     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4646*67e74705SXin Li     bool ExpectParameterPack) {
4647*67e74705SXin Li   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4648*67e74705SXin Li   TypeSourceInfo *NewDI = nullptr;
4649*67e74705SXin Li 
4650*67e74705SXin Li   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4651*67e74705SXin Li     // If we're substituting into a pack expansion type and we know the
4652*67e74705SXin Li     // length we want to expand to, just substitute for the pattern.
4653*67e74705SXin Li     TypeLoc OldTL = OldDI->getTypeLoc();
4654*67e74705SXin Li     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4655*67e74705SXin Li 
4656*67e74705SXin Li     TypeLocBuilder TLB;
4657*67e74705SXin Li     TypeLoc NewTL = OldDI->getTypeLoc();
4658*67e74705SXin Li     TLB.reserve(NewTL.getFullDataSize());
4659*67e74705SXin Li 
4660*67e74705SXin Li     QualType Result = getDerived().TransformType(TLB,
4661*67e74705SXin Li                                                OldExpansionTL.getPatternLoc());
4662*67e74705SXin Li     if (Result.isNull())
4663*67e74705SXin Li       return nullptr;
4664*67e74705SXin Li 
4665*67e74705SXin Li     Result = RebuildPackExpansionType(Result,
4666*67e74705SXin Li                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4667*67e74705SXin Li                                       OldExpansionTL.getEllipsisLoc(),
4668*67e74705SXin Li                                       NumExpansions);
4669*67e74705SXin Li     if (Result.isNull())
4670*67e74705SXin Li       return nullptr;
4671*67e74705SXin Li 
4672*67e74705SXin Li     PackExpansionTypeLoc NewExpansionTL
4673*67e74705SXin Li       = TLB.push<PackExpansionTypeLoc>(Result);
4674*67e74705SXin Li     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4675*67e74705SXin Li     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4676*67e74705SXin Li   } else
4677*67e74705SXin Li     NewDI = getDerived().TransformType(OldDI);
4678*67e74705SXin Li   if (!NewDI)
4679*67e74705SXin Li     return nullptr;
4680*67e74705SXin Li 
4681*67e74705SXin Li   if (NewDI == OldDI && indexAdjustment == 0)
4682*67e74705SXin Li     return OldParm;
4683*67e74705SXin Li 
4684*67e74705SXin Li   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4685*67e74705SXin Li                                              OldParm->getDeclContext(),
4686*67e74705SXin Li                                              OldParm->getInnerLocStart(),
4687*67e74705SXin Li                                              OldParm->getLocation(),
4688*67e74705SXin Li                                              OldParm->getIdentifier(),
4689*67e74705SXin Li                                              NewDI->getType(),
4690*67e74705SXin Li                                              NewDI,
4691*67e74705SXin Li                                              OldParm->getStorageClass(),
4692*67e74705SXin Li                                              /* DefArg */ nullptr);
4693*67e74705SXin Li   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4694*67e74705SXin Li                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4695*67e74705SXin Li   return newParm;
4696*67e74705SXin Li }
4697*67e74705SXin Li 
4698*67e74705SXin Li template <typename Derived>
TransformFunctionTypeParams(SourceLocation Loc,ArrayRef<ParmVarDecl * > Params,const QualType * ParamTypes,const FunctionProtoType::ExtParameterInfo * ParamInfos,SmallVectorImpl<QualType> & OutParamTypes,SmallVectorImpl<ParmVarDecl * > * PVars,Sema::ExtParameterInfoBuilder & PInfos)4699*67e74705SXin Li bool TreeTransform<Derived>::TransformFunctionTypeParams(
4700*67e74705SXin Li     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4701*67e74705SXin Li     const QualType *ParamTypes,
4702*67e74705SXin Li     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4703*67e74705SXin Li     SmallVectorImpl<QualType> &OutParamTypes,
4704*67e74705SXin Li     SmallVectorImpl<ParmVarDecl *> *PVars,
4705*67e74705SXin Li     Sema::ExtParameterInfoBuilder &PInfos) {
4706*67e74705SXin Li   int indexAdjustment = 0;
4707*67e74705SXin Li 
4708*67e74705SXin Li   unsigned NumParams = Params.size();
4709*67e74705SXin Li   for (unsigned i = 0; i != NumParams; ++i) {
4710*67e74705SXin Li     if (ParmVarDecl *OldParm = Params[i]) {
4711*67e74705SXin Li       assert(OldParm->getFunctionScopeIndex() == i);
4712*67e74705SXin Li 
4713*67e74705SXin Li       Optional<unsigned> NumExpansions;
4714*67e74705SXin Li       ParmVarDecl *NewParm = nullptr;
4715*67e74705SXin Li       if (OldParm->isParameterPack()) {
4716*67e74705SXin Li         // We have a function parameter pack that may need to be expanded.
4717*67e74705SXin Li         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4718*67e74705SXin Li 
4719*67e74705SXin Li         // Find the parameter packs that could be expanded.
4720*67e74705SXin Li         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4721*67e74705SXin Li         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4722*67e74705SXin Li         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4723*67e74705SXin Li         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4724*67e74705SXin Li         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4725*67e74705SXin Li 
4726*67e74705SXin Li         // Determine whether we should expand the parameter packs.
4727*67e74705SXin Li         bool ShouldExpand = false;
4728*67e74705SXin Li         bool RetainExpansion = false;
4729*67e74705SXin Li         Optional<unsigned> OrigNumExpansions =
4730*67e74705SXin Li             ExpansionTL.getTypePtr()->getNumExpansions();
4731*67e74705SXin Li         NumExpansions = OrigNumExpansions;
4732*67e74705SXin Li         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4733*67e74705SXin Li                                                  Pattern.getSourceRange(),
4734*67e74705SXin Li                                                  Unexpanded,
4735*67e74705SXin Li                                                  ShouldExpand,
4736*67e74705SXin Li                                                  RetainExpansion,
4737*67e74705SXin Li                                                  NumExpansions)) {
4738*67e74705SXin Li           return true;
4739*67e74705SXin Li         }
4740*67e74705SXin Li 
4741*67e74705SXin Li         if (ShouldExpand) {
4742*67e74705SXin Li           // Expand the function parameter pack into multiple, separate
4743*67e74705SXin Li           // parameters.
4744*67e74705SXin Li           getDerived().ExpandingFunctionParameterPack(OldParm);
4745*67e74705SXin Li           for (unsigned I = 0; I != *NumExpansions; ++I) {
4746*67e74705SXin Li             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4747*67e74705SXin Li             ParmVarDecl *NewParm
4748*67e74705SXin Li               = getDerived().TransformFunctionTypeParam(OldParm,
4749*67e74705SXin Li                                                         indexAdjustment++,
4750*67e74705SXin Li                                                         OrigNumExpansions,
4751*67e74705SXin Li                                                 /*ExpectParameterPack=*/false);
4752*67e74705SXin Li             if (!NewParm)
4753*67e74705SXin Li               return true;
4754*67e74705SXin Li 
4755*67e74705SXin Li             if (ParamInfos)
4756*67e74705SXin Li               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4757*67e74705SXin Li             OutParamTypes.push_back(NewParm->getType());
4758*67e74705SXin Li             if (PVars)
4759*67e74705SXin Li               PVars->push_back(NewParm);
4760*67e74705SXin Li           }
4761*67e74705SXin Li 
4762*67e74705SXin Li           // If we're supposed to retain a pack expansion, do so by temporarily
4763*67e74705SXin Li           // forgetting the partially-substituted parameter pack.
4764*67e74705SXin Li           if (RetainExpansion) {
4765*67e74705SXin Li             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4766*67e74705SXin Li             ParmVarDecl *NewParm
4767*67e74705SXin Li               = getDerived().TransformFunctionTypeParam(OldParm,
4768*67e74705SXin Li                                                         indexAdjustment++,
4769*67e74705SXin Li                                                         OrigNumExpansions,
4770*67e74705SXin Li                                                 /*ExpectParameterPack=*/false);
4771*67e74705SXin Li             if (!NewParm)
4772*67e74705SXin Li               return true;
4773*67e74705SXin Li 
4774*67e74705SXin Li             if (ParamInfos)
4775*67e74705SXin Li               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4776*67e74705SXin Li             OutParamTypes.push_back(NewParm->getType());
4777*67e74705SXin Li             if (PVars)
4778*67e74705SXin Li               PVars->push_back(NewParm);
4779*67e74705SXin Li           }
4780*67e74705SXin Li 
4781*67e74705SXin Li           // The next parameter should have the same adjustment as the
4782*67e74705SXin Li           // last thing we pushed, but we post-incremented indexAdjustment
4783*67e74705SXin Li           // on every push.  Also, if we push nothing, the adjustment should
4784*67e74705SXin Li           // go down by one.
4785*67e74705SXin Li           indexAdjustment--;
4786*67e74705SXin Li 
4787*67e74705SXin Li           // We're done with the pack expansion.
4788*67e74705SXin Li           continue;
4789*67e74705SXin Li         }
4790*67e74705SXin Li 
4791*67e74705SXin Li         // We'll substitute the parameter now without expanding the pack
4792*67e74705SXin Li         // expansion.
4793*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4794*67e74705SXin Li         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4795*67e74705SXin Li                                                           indexAdjustment,
4796*67e74705SXin Li                                                           NumExpansions,
4797*67e74705SXin Li                                                   /*ExpectParameterPack=*/true);
4798*67e74705SXin Li       } else {
4799*67e74705SXin Li         NewParm = getDerived().TransformFunctionTypeParam(
4800*67e74705SXin Li             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4801*67e74705SXin Li       }
4802*67e74705SXin Li 
4803*67e74705SXin Li       if (!NewParm)
4804*67e74705SXin Li         return true;
4805*67e74705SXin Li 
4806*67e74705SXin Li       if (ParamInfos)
4807*67e74705SXin Li         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4808*67e74705SXin Li       OutParamTypes.push_back(NewParm->getType());
4809*67e74705SXin Li       if (PVars)
4810*67e74705SXin Li         PVars->push_back(NewParm);
4811*67e74705SXin Li       continue;
4812*67e74705SXin Li     }
4813*67e74705SXin Li 
4814*67e74705SXin Li     // Deal with the possibility that we don't have a parameter
4815*67e74705SXin Li     // declaration for this parameter.
4816*67e74705SXin Li     QualType OldType = ParamTypes[i];
4817*67e74705SXin Li     bool IsPackExpansion = false;
4818*67e74705SXin Li     Optional<unsigned> NumExpansions;
4819*67e74705SXin Li     QualType NewType;
4820*67e74705SXin Li     if (const PackExpansionType *Expansion
4821*67e74705SXin Li                                        = dyn_cast<PackExpansionType>(OldType)) {
4822*67e74705SXin Li       // We have a function parameter pack that may need to be expanded.
4823*67e74705SXin Li       QualType Pattern = Expansion->getPattern();
4824*67e74705SXin Li       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4825*67e74705SXin Li       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4826*67e74705SXin Li 
4827*67e74705SXin Li       // Determine whether we should expand the parameter packs.
4828*67e74705SXin Li       bool ShouldExpand = false;
4829*67e74705SXin Li       bool RetainExpansion = false;
4830*67e74705SXin Li       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4831*67e74705SXin Li                                                Unexpanded,
4832*67e74705SXin Li                                                ShouldExpand,
4833*67e74705SXin Li                                                RetainExpansion,
4834*67e74705SXin Li                                                NumExpansions)) {
4835*67e74705SXin Li         return true;
4836*67e74705SXin Li       }
4837*67e74705SXin Li 
4838*67e74705SXin Li       if (ShouldExpand) {
4839*67e74705SXin Li         // Expand the function parameter pack into multiple, separate
4840*67e74705SXin Li         // parameters.
4841*67e74705SXin Li         for (unsigned I = 0; I != *NumExpansions; ++I) {
4842*67e74705SXin Li           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4843*67e74705SXin Li           QualType NewType = getDerived().TransformType(Pattern);
4844*67e74705SXin Li           if (NewType.isNull())
4845*67e74705SXin Li             return true;
4846*67e74705SXin Li 
4847*67e74705SXin Li           if (NewType->containsUnexpandedParameterPack()) {
4848*67e74705SXin Li             NewType =
4849*67e74705SXin Li                 getSema().getASTContext().getPackExpansionType(NewType, None);
4850*67e74705SXin Li 
4851*67e74705SXin Li             if (NewType.isNull())
4852*67e74705SXin Li               return true;
4853*67e74705SXin Li           }
4854*67e74705SXin Li 
4855*67e74705SXin Li           if (ParamInfos)
4856*67e74705SXin Li             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4857*67e74705SXin Li           OutParamTypes.push_back(NewType);
4858*67e74705SXin Li           if (PVars)
4859*67e74705SXin Li             PVars->push_back(nullptr);
4860*67e74705SXin Li         }
4861*67e74705SXin Li 
4862*67e74705SXin Li         // We're done with the pack expansion.
4863*67e74705SXin Li         continue;
4864*67e74705SXin Li       }
4865*67e74705SXin Li 
4866*67e74705SXin Li       // If we're supposed to retain a pack expansion, do so by temporarily
4867*67e74705SXin Li       // forgetting the partially-substituted parameter pack.
4868*67e74705SXin Li       if (RetainExpansion) {
4869*67e74705SXin Li         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4870*67e74705SXin Li         QualType NewType = getDerived().TransformType(Pattern);
4871*67e74705SXin Li         if (NewType.isNull())
4872*67e74705SXin Li           return true;
4873*67e74705SXin Li 
4874*67e74705SXin Li         if (ParamInfos)
4875*67e74705SXin Li           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4876*67e74705SXin Li         OutParamTypes.push_back(NewType);
4877*67e74705SXin Li         if (PVars)
4878*67e74705SXin Li           PVars->push_back(nullptr);
4879*67e74705SXin Li       }
4880*67e74705SXin Li 
4881*67e74705SXin Li       // We'll substitute the parameter now without expanding the pack
4882*67e74705SXin Li       // expansion.
4883*67e74705SXin Li       OldType = Expansion->getPattern();
4884*67e74705SXin Li       IsPackExpansion = true;
4885*67e74705SXin Li       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4886*67e74705SXin Li       NewType = getDerived().TransformType(OldType);
4887*67e74705SXin Li     } else {
4888*67e74705SXin Li       NewType = getDerived().TransformType(OldType);
4889*67e74705SXin Li     }
4890*67e74705SXin Li 
4891*67e74705SXin Li     if (NewType.isNull())
4892*67e74705SXin Li       return true;
4893*67e74705SXin Li 
4894*67e74705SXin Li     if (IsPackExpansion)
4895*67e74705SXin Li       NewType = getSema().Context.getPackExpansionType(NewType,
4896*67e74705SXin Li                                                        NumExpansions);
4897*67e74705SXin Li 
4898*67e74705SXin Li     if (ParamInfos)
4899*67e74705SXin Li       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4900*67e74705SXin Li     OutParamTypes.push_back(NewType);
4901*67e74705SXin Li     if (PVars)
4902*67e74705SXin Li       PVars->push_back(nullptr);
4903*67e74705SXin Li   }
4904*67e74705SXin Li 
4905*67e74705SXin Li #ifndef NDEBUG
4906*67e74705SXin Li   if (PVars) {
4907*67e74705SXin Li     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4908*67e74705SXin Li       if (ParmVarDecl *parm = (*PVars)[i])
4909*67e74705SXin Li         assert(parm->getFunctionScopeIndex() == i);
4910*67e74705SXin Li   }
4911*67e74705SXin Li #endif
4912*67e74705SXin Li 
4913*67e74705SXin Li   return false;
4914*67e74705SXin Li }
4915*67e74705SXin Li 
4916*67e74705SXin Li template<typename Derived>
4917*67e74705SXin Li QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)4918*67e74705SXin Li TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4919*67e74705SXin Li                                                    FunctionProtoTypeLoc TL) {
4920*67e74705SXin Li   SmallVector<QualType, 4> ExceptionStorage;
4921*67e74705SXin Li   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
4922*67e74705SXin Li   return getDerived().TransformFunctionProtoType(
4923*67e74705SXin Li       TLB, TL, nullptr, 0,
4924*67e74705SXin Li       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
4925*67e74705SXin Li         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
4926*67e74705SXin Li                                             ExceptionStorage, Changed);
4927*67e74705SXin Li       });
4928*67e74705SXin Li }
4929*67e74705SXin Li 
4930*67e74705SXin Li template<typename Derived> template<typename Fn>
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL,CXXRecordDecl * ThisContext,unsigned ThisTypeQuals,Fn TransformExceptionSpec)4931*67e74705SXin Li QualType TreeTransform<Derived>::TransformFunctionProtoType(
4932*67e74705SXin Li     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
4933*67e74705SXin Li     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
4934*67e74705SXin Li 
4935*67e74705SXin Li   // Transform the parameters and return type.
4936*67e74705SXin Li   //
4937*67e74705SXin Li   // We are required to instantiate the params and return type in source order.
4938*67e74705SXin Li   // When the function has a trailing return type, we instantiate the
4939*67e74705SXin Li   // parameters before the return type,  since the return type can then refer
4940*67e74705SXin Li   // to the parameters themselves (via decltype, sizeof, etc.).
4941*67e74705SXin Li   //
4942*67e74705SXin Li   SmallVector<QualType, 4> ParamTypes;
4943*67e74705SXin Li   SmallVector<ParmVarDecl*, 4> ParamDecls;
4944*67e74705SXin Li   Sema::ExtParameterInfoBuilder ExtParamInfos;
4945*67e74705SXin Li   const FunctionProtoType *T = TL.getTypePtr();
4946*67e74705SXin Li 
4947*67e74705SXin Li   QualType ResultType;
4948*67e74705SXin Li 
4949*67e74705SXin Li   if (T->hasTrailingReturn()) {
4950*67e74705SXin Li     if (getDerived().TransformFunctionTypeParams(
4951*67e74705SXin Li             TL.getBeginLoc(), TL.getParams(),
4952*67e74705SXin Li             TL.getTypePtr()->param_type_begin(),
4953*67e74705SXin Li             T->getExtParameterInfosOrNull(),
4954*67e74705SXin Li             ParamTypes, &ParamDecls, ExtParamInfos))
4955*67e74705SXin Li       return QualType();
4956*67e74705SXin Li 
4957*67e74705SXin Li     {
4958*67e74705SXin Li       // C++11 [expr.prim.general]p3:
4959*67e74705SXin Li       //   If a declaration declares a member function or member function
4960*67e74705SXin Li       //   template of a class X, the expression this is a prvalue of type
4961*67e74705SXin Li       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4962*67e74705SXin Li       //   and the end of the function-definition, member-declarator, or
4963*67e74705SXin Li       //   declarator.
4964*67e74705SXin Li       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4965*67e74705SXin Li 
4966*67e74705SXin Li       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4967*67e74705SXin Li       if (ResultType.isNull())
4968*67e74705SXin Li         return QualType();
4969*67e74705SXin Li     }
4970*67e74705SXin Li   }
4971*67e74705SXin Li   else {
4972*67e74705SXin Li     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4973*67e74705SXin Li     if (ResultType.isNull())
4974*67e74705SXin Li       return QualType();
4975*67e74705SXin Li 
4976*67e74705SXin Li     if (getDerived().TransformFunctionTypeParams(
4977*67e74705SXin Li             TL.getBeginLoc(), TL.getParams(),
4978*67e74705SXin Li             TL.getTypePtr()->param_type_begin(),
4979*67e74705SXin Li             T->getExtParameterInfosOrNull(),
4980*67e74705SXin Li             ParamTypes, &ParamDecls, ExtParamInfos))
4981*67e74705SXin Li       return QualType();
4982*67e74705SXin Li   }
4983*67e74705SXin Li 
4984*67e74705SXin Li   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
4985*67e74705SXin Li 
4986*67e74705SXin Li   bool EPIChanged = false;
4987*67e74705SXin Li   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
4988*67e74705SXin Li     return QualType();
4989*67e74705SXin Li 
4990*67e74705SXin Li   // Handle extended parameter information.
4991*67e74705SXin Li   if (auto NewExtParamInfos =
4992*67e74705SXin Li         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
4993*67e74705SXin Li     if (!EPI.ExtParameterInfos ||
4994*67e74705SXin Li         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
4995*67e74705SXin Li           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
4996*67e74705SXin Li       EPIChanged = true;
4997*67e74705SXin Li     }
4998*67e74705SXin Li     EPI.ExtParameterInfos = NewExtParamInfos;
4999*67e74705SXin Li   } else if (EPI.ExtParameterInfos) {
5000*67e74705SXin Li     EPIChanged = true;
5001*67e74705SXin Li     EPI.ExtParameterInfos = nullptr;
5002*67e74705SXin Li   }
5003*67e74705SXin Li 
5004*67e74705SXin Li   QualType Result = TL.getType();
5005*67e74705SXin Li   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5006*67e74705SXin Li       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5007*67e74705SXin Li     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5008*67e74705SXin Li     if (Result.isNull())
5009*67e74705SXin Li       return QualType();
5010*67e74705SXin Li   }
5011*67e74705SXin Li 
5012*67e74705SXin Li   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5013*67e74705SXin Li   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5014*67e74705SXin Li   NewTL.setLParenLoc(TL.getLParenLoc());
5015*67e74705SXin Li   NewTL.setRParenLoc(TL.getRParenLoc());
5016*67e74705SXin Li   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5017*67e74705SXin Li   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5018*67e74705SXin Li     NewTL.setParam(i, ParamDecls[i]);
5019*67e74705SXin Li 
5020*67e74705SXin Li   return Result;
5021*67e74705SXin Li }
5022*67e74705SXin Li 
5023*67e74705SXin Li template<typename Derived>
TransformExceptionSpec(SourceLocation Loc,FunctionProtoType::ExceptionSpecInfo & ESI,SmallVectorImpl<QualType> & Exceptions,bool & Changed)5024*67e74705SXin Li bool TreeTransform<Derived>::TransformExceptionSpec(
5025*67e74705SXin Li     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5026*67e74705SXin Li     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5027*67e74705SXin Li   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5028*67e74705SXin Li 
5029*67e74705SXin Li   // Instantiate a dynamic noexcept expression, if any.
5030*67e74705SXin Li   if (ESI.Type == EST_ComputedNoexcept) {
5031*67e74705SXin Li     EnterExpressionEvaluationContext Unevaluated(getSema(),
5032*67e74705SXin Li                                                  Sema::ConstantEvaluated);
5033*67e74705SXin Li     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5034*67e74705SXin Li     if (NoexceptExpr.isInvalid())
5035*67e74705SXin Li       return true;
5036*67e74705SXin Li 
5037*67e74705SXin Li     // FIXME: This is bogus, a noexcept expression is not a condition.
5038*67e74705SXin Li     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5039*67e74705SXin Li     if (NoexceptExpr.isInvalid())
5040*67e74705SXin Li       return true;
5041*67e74705SXin Li 
5042*67e74705SXin Li     if (!NoexceptExpr.get()->isValueDependent()) {
5043*67e74705SXin Li       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5044*67e74705SXin Li           NoexceptExpr.get(), nullptr,
5045*67e74705SXin Li           diag::err_noexcept_needs_constant_expression,
5046*67e74705SXin Li           /*AllowFold*/false);
5047*67e74705SXin Li       if (NoexceptExpr.isInvalid())
5048*67e74705SXin Li         return true;
5049*67e74705SXin Li     }
5050*67e74705SXin Li 
5051*67e74705SXin Li     if (ESI.NoexceptExpr != NoexceptExpr.get())
5052*67e74705SXin Li       Changed = true;
5053*67e74705SXin Li     ESI.NoexceptExpr = NoexceptExpr.get();
5054*67e74705SXin Li   }
5055*67e74705SXin Li 
5056*67e74705SXin Li   if (ESI.Type != EST_Dynamic)
5057*67e74705SXin Li     return false;
5058*67e74705SXin Li 
5059*67e74705SXin Li   // Instantiate a dynamic exception specification's type.
5060*67e74705SXin Li   for (QualType T : ESI.Exceptions) {
5061*67e74705SXin Li     if (const PackExpansionType *PackExpansion =
5062*67e74705SXin Li             T->getAs<PackExpansionType>()) {
5063*67e74705SXin Li       Changed = true;
5064*67e74705SXin Li 
5065*67e74705SXin Li       // We have a pack expansion. Instantiate it.
5066*67e74705SXin Li       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5067*67e74705SXin Li       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5068*67e74705SXin Li                                               Unexpanded);
5069*67e74705SXin Li       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5070*67e74705SXin Li 
5071*67e74705SXin Li       // Determine whether the set of unexpanded parameter packs can and
5072*67e74705SXin Li       // should
5073*67e74705SXin Li       // be expanded.
5074*67e74705SXin Li       bool Expand = false;
5075*67e74705SXin Li       bool RetainExpansion = false;
5076*67e74705SXin Li       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5077*67e74705SXin Li       // FIXME: Track the location of the ellipsis (and track source location
5078*67e74705SXin Li       // information for the types in the exception specification in general).
5079*67e74705SXin Li       if (getDerived().TryExpandParameterPacks(
5080*67e74705SXin Li               Loc, SourceRange(), Unexpanded, Expand,
5081*67e74705SXin Li               RetainExpansion, NumExpansions))
5082*67e74705SXin Li         return true;
5083*67e74705SXin Li 
5084*67e74705SXin Li       if (!Expand) {
5085*67e74705SXin Li         // We can't expand this pack expansion into separate arguments yet;
5086*67e74705SXin Li         // just substitute into the pattern and create a new pack expansion
5087*67e74705SXin Li         // type.
5088*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5089*67e74705SXin Li         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5090*67e74705SXin Li         if (U.isNull())
5091*67e74705SXin Li           return true;
5092*67e74705SXin Li 
5093*67e74705SXin Li         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5094*67e74705SXin Li         Exceptions.push_back(U);
5095*67e74705SXin Li         continue;
5096*67e74705SXin Li       }
5097*67e74705SXin Li 
5098*67e74705SXin Li       // Substitute into the pack expansion pattern for each slice of the
5099*67e74705SXin Li       // pack.
5100*67e74705SXin Li       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5101*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5102*67e74705SXin Li 
5103*67e74705SXin Li         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5104*67e74705SXin Li         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5105*67e74705SXin Li           return true;
5106*67e74705SXin Li 
5107*67e74705SXin Li         Exceptions.push_back(U);
5108*67e74705SXin Li       }
5109*67e74705SXin Li     } else {
5110*67e74705SXin Li       QualType U = getDerived().TransformType(T);
5111*67e74705SXin Li       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5112*67e74705SXin Li         return true;
5113*67e74705SXin Li       if (T != U)
5114*67e74705SXin Li         Changed = true;
5115*67e74705SXin Li 
5116*67e74705SXin Li       Exceptions.push_back(U);
5117*67e74705SXin Li     }
5118*67e74705SXin Li   }
5119*67e74705SXin Li 
5120*67e74705SXin Li   ESI.Exceptions = Exceptions;
5121*67e74705SXin Li   return false;
5122*67e74705SXin Li }
5123*67e74705SXin Li 
5124*67e74705SXin Li template<typename Derived>
TransformFunctionNoProtoType(TypeLocBuilder & TLB,FunctionNoProtoTypeLoc TL)5125*67e74705SXin Li QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5126*67e74705SXin Li                                                  TypeLocBuilder &TLB,
5127*67e74705SXin Li                                                  FunctionNoProtoTypeLoc TL) {
5128*67e74705SXin Li   const FunctionNoProtoType *T = TL.getTypePtr();
5129*67e74705SXin Li   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5130*67e74705SXin Li   if (ResultType.isNull())
5131*67e74705SXin Li     return QualType();
5132*67e74705SXin Li 
5133*67e74705SXin Li   QualType Result = TL.getType();
5134*67e74705SXin Li   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5135*67e74705SXin Li     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5136*67e74705SXin Li 
5137*67e74705SXin Li   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5138*67e74705SXin Li   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5139*67e74705SXin Li   NewTL.setLParenLoc(TL.getLParenLoc());
5140*67e74705SXin Li   NewTL.setRParenLoc(TL.getRParenLoc());
5141*67e74705SXin Li   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5142*67e74705SXin Li 
5143*67e74705SXin Li   return Result;
5144*67e74705SXin Li }
5145*67e74705SXin Li 
5146*67e74705SXin Li template<typename Derived> QualType
TransformUnresolvedUsingType(TypeLocBuilder & TLB,UnresolvedUsingTypeLoc TL)5147*67e74705SXin Li TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5148*67e74705SXin Li                                                  UnresolvedUsingTypeLoc TL) {
5149*67e74705SXin Li   const UnresolvedUsingType *T = TL.getTypePtr();
5150*67e74705SXin Li   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5151*67e74705SXin Li   if (!D)
5152*67e74705SXin Li     return QualType();
5153*67e74705SXin Li 
5154*67e74705SXin Li   QualType Result = TL.getType();
5155*67e74705SXin Li   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5156*67e74705SXin Li     Result = getDerived().RebuildUnresolvedUsingType(D);
5157*67e74705SXin Li     if (Result.isNull())
5158*67e74705SXin Li       return QualType();
5159*67e74705SXin Li   }
5160*67e74705SXin Li 
5161*67e74705SXin Li   // We might get an arbitrary type spec type back.  We should at
5162*67e74705SXin Li   // least always get a type spec type, though.
5163*67e74705SXin Li   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5164*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5165*67e74705SXin Li 
5166*67e74705SXin Li   return Result;
5167*67e74705SXin Li }
5168*67e74705SXin Li 
5169*67e74705SXin Li template<typename Derived>
TransformTypedefType(TypeLocBuilder & TLB,TypedefTypeLoc TL)5170*67e74705SXin Li QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5171*67e74705SXin Li                                                       TypedefTypeLoc TL) {
5172*67e74705SXin Li   const TypedefType *T = TL.getTypePtr();
5173*67e74705SXin Li   TypedefNameDecl *Typedef
5174*67e74705SXin Li     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5175*67e74705SXin Li                                                                T->getDecl()));
5176*67e74705SXin Li   if (!Typedef)
5177*67e74705SXin Li     return QualType();
5178*67e74705SXin Li 
5179*67e74705SXin Li   QualType Result = TL.getType();
5180*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5181*67e74705SXin Li       Typedef != T->getDecl()) {
5182*67e74705SXin Li     Result = getDerived().RebuildTypedefType(Typedef);
5183*67e74705SXin Li     if (Result.isNull())
5184*67e74705SXin Li       return QualType();
5185*67e74705SXin Li   }
5186*67e74705SXin Li 
5187*67e74705SXin Li   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5188*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5189*67e74705SXin Li 
5190*67e74705SXin Li   return Result;
5191*67e74705SXin Li }
5192*67e74705SXin Li 
5193*67e74705SXin Li template<typename Derived>
TransformTypeOfExprType(TypeLocBuilder & TLB,TypeOfExprTypeLoc TL)5194*67e74705SXin Li QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5195*67e74705SXin Li                                                       TypeOfExprTypeLoc TL) {
5196*67e74705SXin Li   // typeof expressions are not potentially evaluated contexts
5197*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5198*67e74705SXin Li                                                Sema::ReuseLambdaContextDecl);
5199*67e74705SXin Li 
5200*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5201*67e74705SXin Li   if (E.isInvalid())
5202*67e74705SXin Li     return QualType();
5203*67e74705SXin Li 
5204*67e74705SXin Li   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5205*67e74705SXin Li   if (E.isInvalid())
5206*67e74705SXin Li     return QualType();
5207*67e74705SXin Li 
5208*67e74705SXin Li   QualType Result = TL.getType();
5209*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5210*67e74705SXin Li       E.get() != TL.getUnderlyingExpr()) {
5211*67e74705SXin Li     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5212*67e74705SXin Li     if (Result.isNull())
5213*67e74705SXin Li       return QualType();
5214*67e74705SXin Li   }
5215*67e74705SXin Li   else E.get();
5216*67e74705SXin Li 
5217*67e74705SXin Li   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5218*67e74705SXin Li   NewTL.setTypeofLoc(TL.getTypeofLoc());
5219*67e74705SXin Li   NewTL.setLParenLoc(TL.getLParenLoc());
5220*67e74705SXin Li   NewTL.setRParenLoc(TL.getRParenLoc());
5221*67e74705SXin Li 
5222*67e74705SXin Li   return Result;
5223*67e74705SXin Li }
5224*67e74705SXin Li 
5225*67e74705SXin Li template<typename Derived>
TransformTypeOfType(TypeLocBuilder & TLB,TypeOfTypeLoc TL)5226*67e74705SXin Li QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5227*67e74705SXin Li                                                      TypeOfTypeLoc TL) {
5228*67e74705SXin Li   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5229*67e74705SXin Li   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5230*67e74705SXin Li   if (!New_Under_TI)
5231*67e74705SXin Li     return QualType();
5232*67e74705SXin Li 
5233*67e74705SXin Li   QualType Result = TL.getType();
5234*67e74705SXin Li   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5235*67e74705SXin Li     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5236*67e74705SXin Li     if (Result.isNull())
5237*67e74705SXin Li       return QualType();
5238*67e74705SXin Li   }
5239*67e74705SXin Li 
5240*67e74705SXin Li   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5241*67e74705SXin Li   NewTL.setTypeofLoc(TL.getTypeofLoc());
5242*67e74705SXin Li   NewTL.setLParenLoc(TL.getLParenLoc());
5243*67e74705SXin Li   NewTL.setRParenLoc(TL.getRParenLoc());
5244*67e74705SXin Li   NewTL.setUnderlyingTInfo(New_Under_TI);
5245*67e74705SXin Li 
5246*67e74705SXin Li   return Result;
5247*67e74705SXin Li }
5248*67e74705SXin Li 
5249*67e74705SXin Li template<typename Derived>
TransformDecltypeType(TypeLocBuilder & TLB,DecltypeTypeLoc TL)5250*67e74705SXin Li QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5251*67e74705SXin Li                                                        DecltypeTypeLoc TL) {
5252*67e74705SXin Li   const DecltypeType *T = TL.getTypePtr();
5253*67e74705SXin Li 
5254*67e74705SXin Li   // decltype expressions are not potentially evaluated contexts
5255*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
5256*67e74705SXin Li                                                nullptr, /*IsDecltype=*/ true);
5257*67e74705SXin Li 
5258*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5259*67e74705SXin Li   if (E.isInvalid())
5260*67e74705SXin Li     return QualType();
5261*67e74705SXin Li 
5262*67e74705SXin Li   E = getSema().ActOnDecltypeExpression(E.get());
5263*67e74705SXin Li   if (E.isInvalid())
5264*67e74705SXin Li     return QualType();
5265*67e74705SXin Li 
5266*67e74705SXin Li   QualType Result = TL.getType();
5267*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5268*67e74705SXin Li       E.get() != T->getUnderlyingExpr()) {
5269*67e74705SXin Li     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5270*67e74705SXin Li     if (Result.isNull())
5271*67e74705SXin Li       return QualType();
5272*67e74705SXin Li   }
5273*67e74705SXin Li   else E.get();
5274*67e74705SXin Li 
5275*67e74705SXin Li   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5276*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5277*67e74705SXin Li 
5278*67e74705SXin Li   return Result;
5279*67e74705SXin Li }
5280*67e74705SXin Li 
5281*67e74705SXin Li template<typename Derived>
TransformUnaryTransformType(TypeLocBuilder & TLB,UnaryTransformTypeLoc TL)5282*67e74705SXin Li QualType TreeTransform<Derived>::TransformUnaryTransformType(
5283*67e74705SXin Li                                                             TypeLocBuilder &TLB,
5284*67e74705SXin Li                                                      UnaryTransformTypeLoc TL) {
5285*67e74705SXin Li   QualType Result = TL.getType();
5286*67e74705SXin Li   if (Result->isDependentType()) {
5287*67e74705SXin Li     const UnaryTransformType *T = TL.getTypePtr();
5288*67e74705SXin Li     QualType NewBase =
5289*67e74705SXin Li       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5290*67e74705SXin Li     Result = getDerived().RebuildUnaryTransformType(NewBase,
5291*67e74705SXin Li                                                     T->getUTTKind(),
5292*67e74705SXin Li                                                     TL.getKWLoc());
5293*67e74705SXin Li     if (Result.isNull())
5294*67e74705SXin Li       return QualType();
5295*67e74705SXin Li   }
5296*67e74705SXin Li 
5297*67e74705SXin Li   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5298*67e74705SXin Li   NewTL.setKWLoc(TL.getKWLoc());
5299*67e74705SXin Li   NewTL.setParensRange(TL.getParensRange());
5300*67e74705SXin Li   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5301*67e74705SXin Li   return Result;
5302*67e74705SXin Li }
5303*67e74705SXin Li 
5304*67e74705SXin Li template<typename Derived>
TransformAutoType(TypeLocBuilder & TLB,AutoTypeLoc TL)5305*67e74705SXin Li QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5306*67e74705SXin Li                                                    AutoTypeLoc TL) {
5307*67e74705SXin Li   const AutoType *T = TL.getTypePtr();
5308*67e74705SXin Li   QualType OldDeduced = T->getDeducedType();
5309*67e74705SXin Li   QualType NewDeduced;
5310*67e74705SXin Li   if (!OldDeduced.isNull()) {
5311*67e74705SXin Li     NewDeduced = getDerived().TransformType(OldDeduced);
5312*67e74705SXin Li     if (NewDeduced.isNull())
5313*67e74705SXin Li       return QualType();
5314*67e74705SXin Li   }
5315*67e74705SXin Li 
5316*67e74705SXin Li   QualType Result = TL.getType();
5317*67e74705SXin Li   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5318*67e74705SXin Li       T->isDependentType()) {
5319*67e74705SXin Li     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5320*67e74705SXin Li     if (Result.isNull())
5321*67e74705SXin Li       return QualType();
5322*67e74705SXin Li   }
5323*67e74705SXin Li 
5324*67e74705SXin Li   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5325*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5326*67e74705SXin Li 
5327*67e74705SXin Li   return Result;
5328*67e74705SXin Li }
5329*67e74705SXin Li 
5330*67e74705SXin Li template<typename Derived>
TransformRecordType(TypeLocBuilder & TLB,RecordTypeLoc TL)5331*67e74705SXin Li QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5332*67e74705SXin Li                                                      RecordTypeLoc TL) {
5333*67e74705SXin Li   const RecordType *T = TL.getTypePtr();
5334*67e74705SXin Li   RecordDecl *Record
5335*67e74705SXin Li     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5336*67e74705SXin Li                                                           T->getDecl()));
5337*67e74705SXin Li   if (!Record)
5338*67e74705SXin Li     return QualType();
5339*67e74705SXin Li 
5340*67e74705SXin Li   QualType Result = TL.getType();
5341*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5342*67e74705SXin Li       Record != T->getDecl()) {
5343*67e74705SXin Li     Result = getDerived().RebuildRecordType(Record);
5344*67e74705SXin Li     if (Result.isNull())
5345*67e74705SXin Li       return QualType();
5346*67e74705SXin Li   }
5347*67e74705SXin Li 
5348*67e74705SXin Li   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5349*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5350*67e74705SXin Li 
5351*67e74705SXin Li   return Result;
5352*67e74705SXin Li }
5353*67e74705SXin Li 
5354*67e74705SXin Li template<typename Derived>
TransformEnumType(TypeLocBuilder & TLB,EnumTypeLoc TL)5355*67e74705SXin Li QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5356*67e74705SXin Li                                                    EnumTypeLoc TL) {
5357*67e74705SXin Li   const EnumType *T = TL.getTypePtr();
5358*67e74705SXin Li   EnumDecl *Enum
5359*67e74705SXin Li     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5360*67e74705SXin Li                                                         T->getDecl()));
5361*67e74705SXin Li   if (!Enum)
5362*67e74705SXin Li     return QualType();
5363*67e74705SXin Li 
5364*67e74705SXin Li   QualType Result = TL.getType();
5365*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5366*67e74705SXin Li       Enum != T->getDecl()) {
5367*67e74705SXin Li     Result = getDerived().RebuildEnumType(Enum);
5368*67e74705SXin Li     if (Result.isNull())
5369*67e74705SXin Li       return QualType();
5370*67e74705SXin Li   }
5371*67e74705SXin Li 
5372*67e74705SXin Li   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5373*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5374*67e74705SXin Li 
5375*67e74705SXin Li   return Result;
5376*67e74705SXin Li }
5377*67e74705SXin Li 
5378*67e74705SXin Li template<typename Derived>
TransformInjectedClassNameType(TypeLocBuilder & TLB,InjectedClassNameTypeLoc TL)5379*67e74705SXin Li QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5380*67e74705SXin Li                                          TypeLocBuilder &TLB,
5381*67e74705SXin Li                                          InjectedClassNameTypeLoc TL) {
5382*67e74705SXin Li   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5383*67e74705SXin Li                                        TL.getTypePtr()->getDecl());
5384*67e74705SXin Li   if (!D) return QualType();
5385*67e74705SXin Li 
5386*67e74705SXin Li   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5387*67e74705SXin Li   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5388*67e74705SXin Li   return T;
5389*67e74705SXin Li }
5390*67e74705SXin Li 
5391*67e74705SXin Li template<typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)5392*67e74705SXin Li QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5393*67e74705SXin Li                                                 TypeLocBuilder &TLB,
5394*67e74705SXin Li                                                 TemplateTypeParmTypeLoc TL) {
5395*67e74705SXin Li   return TransformTypeSpecType(TLB, TL);
5396*67e74705SXin Li }
5397*67e74705SXin Li 
5398*67e74705SXin Li template<typename Derived>
TransformSubstTemplateTypeParmType(TypeLocBuilder & TLB,SubstTemplateTypeParmTypeLoc TL)5399*67e74705SXin Li QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5400*67e74705SXin Li                                          TypeLocBuilder &TLB,
5401*67e74705SXin Li                                          SubstTemplateTypeParmTypeLoc TL) {
5402*67e74705SXin Li   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5403*67e74705SXin Li 
5404*67e74705SXin Li   // Substitute into the replacement type, which itself might involve something
5405*67e74705SXin Li   // that needs to be transformed. This only tends to occur with default
5406*67e74705SXin Li   // template arguments of template template parameters.
5407*67e74705SXin Li   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5408*67e74705SXin Li   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5409*67e74705SXin Li   if (Replacement.isNull())
5410*67e74705SXin Li     return QualType();
5411*67e74705SXin Li 
5412*67e74705SXin Li   // Always canonicalize the replacement type.
5413*67e74705SXin Li   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5414*67e74705SXin Li   QualType Result
5415*67e74705SXin Li     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5416*67e74705SXin Li                                                    Replacement);
5417*67e74705SXin Li 
5418*67e74705SXin Li   // Propagate type-source information.
5419*67e74705SXin Li   SubstTemplateTypeParmTypeLoc NewTL
5420*67e74705SXin Li     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5421*67e74705SXin Li   NewTL.setNameLoc(TL.getNameLoc());
5422*67e74705SXin Li   return Result;
5423*67e74705SXin Li 
5424*67e74705SXin Li }
5425*67e74705SXin Li 
5426*67e74705SXin Li template<typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)5427*67e74705SXin Li QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5428*67e74705SXin Li                                           TypeLocBuilder &TLB,
5429*67e74705SXin Li                                           SubstTemplateTypeParmPackTypeLoc TL) {
5430*67e74705SXin Li   return TransformTypeSpecType(TLB, TL);
5431*67e74705SXin Li }
5432*67e74705SXin Li 
5433*67e74705SXin Li template<typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL)5434*67e74705SXin Li QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5435*67e74705SXin Li                                                         TypeLocBuilder &TLB,
5436*67e74705SXin Li                                            TemplateSpecializationTypeLoc TL) {
5437*67e74705SXin Li   const TemplateSpecializationType *T = TL.getTypePtr();
5438*67e74705SXin Li 
5439*67e74705SXin Li   // The nested-name-specifier never matters in a TemplateSpecializationType,
5440*67e74705SXin Li   // because we can't have a dependent nested-name-specifier anyway.
5441*67e74705SXin Li   CXXScopeSpec SS;
5442*67e74705SXin Li   TemplateName Template
5443*67e74705SXin Li     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5444*67e74705SXin Li                                          TL.getTemplateNameLoc());
5445*67e74705SXin Li   if (Template.isNull())
5446*67e74705SXin Li     return QualType();
5447*67e74705SXin Li 
5448*67e74705SXin Li   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5449*67e74705SXin Li }
5450*67e74705SXin Li 
5451*67e74705SXin Li template<typename Derived>
TransformAtomicType(TypeLocBuilder & TLB,AtomicTypeLoc TL)5452*67e74705SXin Li QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5453*67e74705SXin Li                                                      AtomicTypeLoc TL) {
5454*67e74705SXin Li   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5455*67e74705SXin Li   if (ValueType.isNull())
5456*67e74705SXin Li     return QualType();
5457*67e74705SXin Li 
5458*67e74705SXin Li   QualType Result = TL.getType();
5459*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5460*67e74705SXin Li       ValueType != TL.getValueLoc().getType()) {
5461*67e74705SXin Li     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5462*67e74705SXin Li     if (Result.isNull())
5463*67e74705SXin Li       return QualType();
5464*67e74705SXin Li   }
5465*67e74705SXin Li 
5466*67e74705SXin Li   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5467*67e74705SXin Li   NewTL.setKWLoc(TL.getKWLoc());
5468*67e74705SXin Li   NewTL.setLParenLoc(TL.getLParenLoc());
5469*67e74705SXin Li   NewTL.setRParenLoc(TL.getRParenLoc());
5470*67e74705SXin Li 
5471*67e74705SXin Li   return Result;
5472*67e74705SXin Li }
5473*67e74705SXin Li 
5474*67e74705SXin Li template <typename Derived>
TransformPipeType(TypeLocBuilder & TLB,PipeTypeLoc TL)5475*67e74705SXin Li QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5476*67e74705SXin Li                                                    PipeTypeLoc TL) {
5477*67e74705SXin Li   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5478*67e74705SXin Li   if (ValueType.isNull())
5479*67e74705SXin Li     return QualType();
5480*67e74705SXin Li 
5481*67e74705SXin Li   QualType Result = TL.getType();
5482*67e74705SXin Li   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5483*67e74705SXin Li     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc());
5484*67e74705SXin Li     if (Result.isNull())
5485*67e74705SXin Li       return QualType();
5486*67e74705SXin Li   }
5487*67e74705SXin Li 
5488*67e74705SXin Li   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5489*67e74705SXin Li   NewTL.setKWLoc(TL.getKWLoc());
5490*67e74705SXin Li 
5491*67e74705SXin Li   return Result;
5492*67e74705SXin Li }
5493*67e74705SXin Li 
5494*67e74705SXin Li   /// \brief Simple iterator that traverses the template arguments in a
5495*67e74705SXin Li   /// container that provides a \c getArgLoc() member function.
5496*67e74705SXin Li   ///
5497*67e74705SXin Li   /// This iterator is intended to be used with the iterator form of
5498*67e74705SXin Li   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5499*67e74705SXin Li   template<typename ArgLocContainer>
5500*67e74705SXin Li   class TemplateArgumentLocContainerIterator {
5501*67e74705SXin Li     ArgLocContainer *Container;
5502*67e74705SXin Li     unsigned Index;
5503*67e74705SXin Li 
5504*67e74705SXin Li   public:
5505*67e74705SXin Li     typedef TemplateArgumentLoc value_type;
5506*67e74705SXin Li     typedef TemplateArgumentLoc reference;
5507*67e74705SXin Li     typedef int difference_type;
5508*67e74705SXin Li     typedef std::input_iterator_tag iterator_category;
5509*67e74705SXin Li 
5510*67e74705SXin Li     class pointer {
5511*67e74705SXin Li       TemplateArgumentLoc Arg;
5512*67e74705SXin Li 
5513*67e74705SXin Li     public:
pointer(TemplateArgumentLoc Arg)5514*67e74705SXin Li       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5515*67e74705SXin Li 
5516*67e74705SXin Li       const TemplateArgumentLoc *operator->() const {
5517*67e74705SXin Li         return &Arg;
5518*67e74705SXin Li       }
5519*67e74705SXin Li     };
5520*67e74705SXin Li 
5521*67e74705SXin Li 
TemplateArgumentLocContainerIterator()5522*67e74705SXin Li     TemplateArgumentLocContainerIterator() {}
5523*67e74705SXin Li 
TemplateArgumentLocContainerIterator(ArgLocContainer & Container,unsigned Index)5524*67e74705SXin Li     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5525*67e74705SXin Li                                  unsigned Index)
5526*67e74705SXin Li       : Container(&Container), Index(Index) { }
5527*67e74705SXin Li 
5528*67e74705SXin Li     TemplateArgumentLocContainerIterator &operator++() {
5529*67e74705SXin Li       ++Index;
5530*67e74705SXin Li       return *this;
5531*67e74705SXin Li     }
5532*67e74705SXin Li 
5533*67e74705SXin Li     TemplateArgumentLocContainerIterator operator++(int) {
5534*67e74705SXin Li       TemplateArgumentLocContainerIterator Old(*this);
5535*67e74705SXin Li       ++(*this);
5536*67e74705SXin Li       return Old;
5537*67e74705SXin Li     }
5538*67e74705SXin Li 
5539*67e74705SXin Li     TemplateArgumentLoc operator*() const {
5540*67e74705SXin Li       return Container->getArgLoc(Index);
5541*67e74705SXin Li     }
5542*67e74705SXin Li 
5543*67e74705SXin Li     pointer operator->() const {
5544*67e74705SXin Li       return pointer(Container->getArgLoc(Index));
5545*67e74705SXin Li     }
5546*67e74705SXin Li 
5547*67e74705SXin Li     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5548*67e74705SXin Li                            const TemplateArgumentLocContainerIterator &Y) {
5549*67e74705SXin Li       return X.Container == Y.Container && X.Index == Y.Index;
5550*67e74705SXin Li     }
5551*67e74705SXin Li 
5552*67e74705SXin Li     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5553*67e74705SXin Li                            const TemplateArgumentLocContainerIterator &Y) {
5554*67e74705SXin Li       return !(X == Y);
5555*67e74705SXin Li     }
5556*67e74705SXin Li   };
5557*67e74705SXin Li 
5558*67e74705SXin Li 
5559*67e74705SXin Li template <typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL,TemplateName Template)5560*67e74705SXin Li QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5561*67e74705SXin Li                                                         TypeLocBuilder &TLB,
5562*67e74705SXin Li                                            TemplateSpecializationTypeLoc TL,
5563*67e74705SXin Li                                                       TemplateName Template) {
5564*67e74705SXin Li   TemplateArgumentListInfo NewTemplateArgs;
5565*67e74705SXin Li   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5566*67e74705SXin Li   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5567*67e74705SXin Li   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5568*67e74705SXin Li     ArgIterator;
5569*67e74705SXin Li   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5570*67e74705SXin Li                                               ArgIterator(TL, TL.getNumArgs()),
5571*67e74705SXin Li                                               NewTemplateArgs))
5572*67e74705SXin Li     return QualType();
5573*67e74705SXin Li 
5574*67e74705SXin Li   // FIXME: maybe don't rebuild if all the template arguments are the same.
5575*67e74705SXin Li 
5576*67e74705SXin Li   QualType Result =
5577*67e74705SXin Li     getDerived().RebuildTemplateSpecializationType(Template,
5578*67e74705SXin Li                                                    TL.getTemplateNameLoc(),
5579*67e74705SXin Li                                                    NewTemplateArgs);
5580*67e74705SXin Li 
5581*67e74705SXin Li   if (!Result.isNull()) {
5582*67e74705SXin Li     // Specializations of template template parameters are represented as
5583*67e74705SXin Li     // TemplateSpecializationTypes, and substitution of type alias templates
5584*67e74705SXin Li     // within a dependent context can transform them into
5585*67e74705SXin Li     // DependentTemplateSpecializationTypes.
5586*67e74705SXin Li     if (isa<DependentTemplateSpecializationType>(Result)) {
5587*67e74705SXin Li       DependentTemplateSpecializationTypeLoc NewTL
5588*67e74705SXin Li         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5589*67e74705SXin Li       NewTL.setElaboratedKeywordLoc(SourceLocation());
5590*67e74705SXin Li       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5591*67e74705SXin Li       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5592*67e74705SXin Li       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5593*67e74705SXin Li       NewTL.setLAngleLoc(TL.getLAngleLoc());
5594*67e74705SXin Li       NewTL.setRAngleLoc(TL.getRAngleLoc());
5595*67e74705SXin Li       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5596*67e74705SXin Li         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5597*67e74705SXin Li       return Result;
5598*67e74705SXin Li     }
5599*67e74705SXin Li 
5600*67e74705SXin Li     TemplateSpecializationTypeLoc NewTL
5601*67e74705SXin Li       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5602*67e74705SXin Li     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5603*67e74705SXin Li     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5604*67e74705SXin Li     NewTL.setLAngleLoc(TL.getLAngleLoc());
5605*67e74705SXin Li     NewTL.setRAngleLoc(TL.getRAngleLoc());
5606*67e74705SXin Li     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5607*67e74705SXin Li       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5608*67e74705SXin Li   }
5609*67e74705SXin Li 
5610*67e74705SXin Li   return Result;
5611*67e74705SXin Li }
5612*67e74705SXin Li 
5613*67e74705SXin Li template <typename Derived>
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,TemplateName Template,CXXScopeSpec & SS)5614*67e74705SXin Li QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5615*67e74705SXin Li                                      TypeLocBuilder &TLB,
5616*67e74705SXin Li                                      DependentTemplateSpecializationTypeLoc TL,
5617*67e74705SXin Li                                      TemplateName Template,
5618*67e74705SXin Li                                      CXXScopeSpec &SS) {
5619*67e74705SXin Li   TemplateArgumentListInfo NewTemplateArgs;
5620*67e74705SXin Li   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5621*67e74705SXin Li   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5622*67e74705SXin Li   typedef TemplateArgumentLocContainerIterator<
5623*67e74705SXin Li             DependentTemplateSpecializationTypeLoc> ArgIterator;
5624*67e74705SXin Li   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5625*67e74705SXin Li                                               ArgIterator(TL, TL.getNumArgs()),
5626*67e74705SXin Li                                               NewTemplateArgs))
5627*67e74705SXin Li     return QualType();
5628*67e74705SXin Li 
5629*67e74705SXin Li   // FIXME: maybe don't rebuild if all the template arguments are the same.
5630*67e74705SXin Li 
5631*67e74705SXin Li   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5632*67e74705SXin Li     QualType Result
5633*67e74705SXin Li       = getSema().Context.getDependentTemplateSpecializationType(
5634*67e74705SXin Li                                                 TL.getTypePtr()->getKeyword(),
5635*67e74705SXin Li                                                          DTN->getQualifier(),
5636*67e74705SXin Li                                                          DTN->getIdentifier(),
5637*67e74705SXin Li                                                                NewTemplateArgs);
5638*67e74705SXin Li 
5639*67e74705SXin Li     DependentTemplateSpecializationTypeLoc NewTL
5640*67e74705SXin Li       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5641*67e74705SXin Li     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5642*67e74705SXin Li     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5643*67e74705SXin Li     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5644*67e74705SXin Li     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5645*67e74705SXin Li     NewTL.setLAngleLoc(TL.getLAngleLoc());
5646*67e74705SXin Li     NewTL.setRAngleLoc(TL.getRAngleLoc());
5647*67e74705SXin Li     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5648*67e74705SXin Li       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5649*67e74705SXin Li     return Result;
5650*67e74705SXin Li   }
5651*67e74705SXin Li 
5652*67e74705SXin Li   QualType Result
5653*67e74705SXin Li     = getDerived().RebuildTemplateSpecializationType(Template,
5654*67e74705SXin Li                                                      TL.getTemplateNameLoc(),
5655*67e74705SXin Li                                                      NewTemplateArgs);
5656*67e74705SXin Li 
5657*67e74705SXin Li   if (!Result.isNull()) {
5658*67e74705SXin Li     /// FIXME: Wrap this in an elaborated-type-specifier?
5659*67e74705SXin Li     TemplateSpecializationTypeLoc NewTL
5660*67e74705SXin Li       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5661*67e74705SXin Li     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5662*67e74705SXin Li     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5663*67e74705SXin Li     NewTL.setLAngleLoc(TL.getLAngleLoc());
5664*67e74705SXin Li     NewTL.setRAngleLoc(TL.getRAngleLoc());
5665*67e74705SXin Li     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5666*67e74705SXin Li       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5667*67e74705SXin Li   }
5668*67e74705SXin Li 
5669*67e74705SXin Li   return Result;
5670*67e74705SXin Li }
5671*67e74705SXin Li 
5672*67e74705SXin Li template<typename Derived>
5673*67e74705SXin Li QualType
TransformElaboratedType(TypeLocBuilder & TLB,ElaboratedTypeLoc TL)5674*67e74705SXin Li TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5675*67e74705SXin Li                                                 ElaboratedTypeLoc TL) {
5676*67e74705SXin Li   const ElaboratedType *T = TL.getTypePtr();
5677*67e74705SXin Li 
5678*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
5679*67e74705SXin Li   // NOTE: the qualifier in an ElaboratedType is optional.
5680*67e74705SXin Li   if (TL.getQualifierLoc()) {
5681*67e74705SXin Li     QualifierLoc
5682*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5683*67e74705SXin Li     if (!QualifierLoc)
5684*67e74705SXin Li       return QualType();
5685*67e74705SXin Li   }
5686*67e74705SXin Li 
5687*67e74705SXin Li   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5688*67e74705SXin Li   if (NamedT.isNull())
5689*67e74705SXin Li     return QualType();
5690*67e74705SXin Li 
5691*67e74705SXin Li   // C++0x [dcl.type.elab]p2:
5692*67e74705SXin Li   //   If the identifier resolves to a typedef-name or the simple-template-id
5693*67e74705SXin Li   //   resolves to an alias template specialization, the
5694*67e74705SXin Li   //   elaborated-type-specifier is ill-formed.
5695*67e74705SXin Li   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5696*67e74705SXin Li     if (const TemplateSpecializationType *TST =
5697*67e74705SXin Li           NamedT->getAs<TemplateSpecializationType>()) {
5698*67e74705SXin Li       TemplateName Template = TST->getTemplateName();
5699*67e74705SXin Li       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5700*67e74705SXin Li               Template.getAsTemplateDecl())) {
5701*67e74705SXin Li         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5702*67e74705SXin Li                      diag::err_tag_reference_non_tag) << 4;
5703*67e74705SXin Li         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5704*67e74705SXin Li       }
5705*67e74705SXin Li     }
5706*67e74705SXin Li   }
5707*67e74705SXin Li 
5708*67e74705SXin Li   QualType Result = TL.getType();
5709*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5710*67e74705SXin Li       QualifierLoc != TL.getQualifierLoc() ||
5711*67e74705SXin Li       NamedT != T->getNamedType()) {
5712*67e74705SXin Li     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5713*67e74705SXin Li                                                 T->getKeyword(),
5714*67e74705SXin Li                                                 QualifierLoc, NamedT);
5715*67e74705SXin Li     if (Result.isNull())
5716*67e74705SXin Li       return QualType();
5717*67e74705SXin Li   }
5718*67e74705SXin Li 
5719*67e74705SXin Li   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5720*67e74705SXin Li   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5721*67e74705SXin Li   NewTL.setQualifierLoc(QualifierLoc);
5722*67e74705SXin Li   return Result;
5723*67e74705SXin Li }
5724*67e74705SXin Li 
5725*67e74705SXin Li template<typename Derived>
TransformAttributedType(TypeLocBuilder & TLB,AttributedTypeLoc TL)5726*67e74705SXin Li QualType TreeTransform<Derived>::TransformAttributedType(
5727*67e74705SXin Li                                                 TypeLocBuilder &TLB,
5728*67e74705SXin Li                                                 AttributedTypeLoc TL) {
5729*67e74705SXin Li   const AttributedType *oldType = TL.getTypePtr();
5730*67e74705SXin Li   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5731*67e74705SXin Li   if (modifiedType.isNull())
5732*67e74705SXin Li     return QualType();
5733*67e74705SXin Li 
5734*67e74705SXin Li   QualType result = TL.getType();
5735*67e74705SXin Li 
5736*67e74705SXin Li   // FIXME: dependent operand expressions?
5737*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5738*67e74705SXin Li       modifiedType != oldType->getModifiedType()) {
5739*67e74705SXin Li     // TODO: this is really lame; we should really be rebuilding the
5740*67e74705SXin Li     // equivalent type from first principles.
5741*67e74705SXin Li     QualType equivalentType
5742*67e74705SXin Li       = getDerived().TransformType(oldType->getEquivalentType());
5743*67e74705SXin Li     if (equivalentType.isNull())
5744*67e74705SXin Li       return QualType();
5745*67e74705SXin Li 
5746*67e74705SXin Li     // Check whether we can add nullability; it is only represented as
5747*67e74705SXin Li     // type sugar, and therefore cannot be diagnosed in any other way.
5748*67e74705SXin Li     if (auto nullability = oldType->getImmediateNullability()) {
5749*67e74705SXin Li       if (!modifiedType->canHaveNullability()) {
5750*67e74705SXin Li         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
5751*67e74705SXin Li           << DiagNullabilityKind(*nullability, false) << modifiedType;
5752*67e74705SXin Li         return QualType();
5753*67e74705SXin Li       }
5754*67e74705SXin Li     }
5755*67e74705SXin Li 
5756*67e74705SXin Li     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5757*67e74705SXin Li                                                modifiedType,
5758*67e74705SXin Li                                                equivalentType);
5759*67e74705SXin Li   }
5760*67e74705SXin Li 
5761*67e74705SXin Li   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5762*67e74705SXin Li   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5763*67e74705SXin Li   if (TL.hasAttrOperand())
5764*67e74705SXin Li     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5765*67e74705SXin Li   if (TL.hasAttrExprOperand())
5766*67e74705SXin Li     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5767*67e74705SXin Li   else if (TL.hasAttrEnumOperand())
5768*67e74705SXin Li     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5769*67e74705SXin Li 
5770*67e74705SXin Li   return result;
5771*67e74705SXin Li }
5772*67e74705SXin Li 
5773*67e74705SXin Li template<typename Derived>
5774*67e74705SXin Li QualType
TransformParenType(TypeLocBuilder & TLB,ParenTypeLoc TL)5775*67e74705SXin Li TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5776*67e74705SXin Li                                            ParenTypeLoc TL) {
5777*67e74705SXin Li   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5778*67e74705SXin Li   if (Inner.isNull())
5779*67e74705SXin Li     return QualType();
5780*67e74705SXin Li 
5781*67e74705SXin Li   QualType Result = TL.getType();
5782*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5783*67e74705SXin Li       Inner != TL.getInnerLoc().getType()) {
5784*67e74705SXin Li     Result = getDerived().RebuildParenType(Inner);
5785*67e74705SXin Li     if (Result.isNull())
5786*67e74705SXin Li       return QualType();
5787*67e74705SXin Li   }
5788*67e74705SXin Li 
5789*67e74705SXin Li   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5790*67e74705SXin Li   NewTL.setLParenLoc(TL.getLParenLoc());
5791*67e74705SXin Li   NewTL.setRParenLoc(TL.getRParenLoc());
5792*67e74705SXin Li   return Result;
5793*67e74705SXin Li }
5794*67e74705SXin Li 
5795*67e74705SXin Li template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL)5796*67e74705SXin Li QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5797*67e74705SXin Li                                                       DependentNameTypeLoc TL) {
5798*67e74705SXin Li   const DependentNameType *T = TL.getTypePtr();
5799*67e74705SXin Li 
5800*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc
5801*67e74705SXin Li     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5802*67e74705SXin Li   if (!QualifierLoc)
5803*67e74705SXin Li     return QualType();
5804*67e74705SXin Li 
5805*67e74705SXin Li   QualType Result
5806*67e74705SXin Li     = getDerived().RebuildDependentNameType(T->getKeyword(),
5807*67e74705SXin Li                                             TL.getElaboratedKeywordLoc(),
5808*67e74705SXin Li                                             QualifierLoc,
5809*67e74705SXin Li                                             T->getIdentifier(),
5810*67e74705SXin Li                                             TL.getNameLoc());
5811*67e74705SXin Li   if (Result.isNull())
5812*67e74705SXin Li     return QualType();
5813*67e74705SXin Li 
5814*67e74705SXin Li   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5815*67e74705SXin Li     QualType NamedT = ElabT->getNamedType();
5816*67e74705SXin Li     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5817*67e74705SXin Li 
5818*67e74705SXin Li     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5819*67e74705SXin Li     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5820*67e74705SXin Li     NewTL.setQualifierLoc(QualifierLoc);
5821*67e74705SXin Li   } else {
5822*67e74705SXin Li     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5823*67e74705SXin Li     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5824*67e74705SXin Li     NewTL.setQualifierLoc(QualifierLoc);
5825*67e74705SXin Li     NewTL.setNameLoc(TL.getNameLoc());
5826*67e74705SXin Li   }
5827*67e74705SXin Li   return Result;
5828*67e74705SXin Li }
5829*67e74705SXin Li 
5830*67e74705SXin Li template<typename Derived>
5831*67e74705SXin Li QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL)5832*67e74705SXin Li           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5833*67e74705SXin Li                                  DependentTemplateSpecializationTypeLoc TL) {
5834*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
5835*67e74705SXin Li   if (TL.getQualifierLoc()) {
5836*67e74705SXin Li     QualifierLoc
5837*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5838*67e74705SXin Li     if (!QualifierLoc)
5839*67e74705SXin Li       return QualType();
5840*67e74705SXin Li   }
5841*67e74705SXin Li 
5842*67e74705SXin Li   return getDerived()
5843*67e74705SXin Li            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5844*67e74705SXin Li }
5845*67e74705SXin Li 
5846*67e74705SXin Li template<typename Derived>
5847*67e74705SXin Li QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,NestedNameSpecifierLoc QualifierLoc)5848*67e74705SXin Li TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5849*67e74705SXin Li                                    DependentTemplateSpecializationTypeLoc TL,
5850*67e74705SXin Li                                        NestedNameSpecifierLoc QualifierLoc) {
5851*67e74705SXin Li   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5852*67e74705SXin Li 
5853*67e74705SXin Li   TemplateArgumentListInfo NewTemplateArgs;
5854*67e74705SXin Li   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5855*67e74705SXin Li   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5856*67e74705SXin Li 
5857*67e74705SXin Li   typedef TemplateArgumentLocContainerIterator<
5858*67e74705SXin Li   DependentTemplateSpecializationTypeLoc> ArgIterator;
5859*67e74705SXin Li   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5860*67e74705SXin Li                                               ArgIterator(TL, TL.getNumArgs()),
5861*67e74705SXin Li                                               NewTemplateArgs))
5862*67e74705SXin Li     return QualType();
5863*67e74705SXin Li 
5864*67e74705SXin Li   QualType Result
5865*67e74705SXin Li     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5866*67e74705SXin Li                                                               QualifierLoc,
5867*67e74705SXin Li                                                             T->getIdentifier(),
5868*67e74705SXin Li                                                        TL.getTemplateNameLoc(),
5869*67e74705SXin Li                                                             NewTemplateArgs);
5870*67e74705SXin Li   if (Result.isNull())
5871*67e74705SXin Li     return QualType();
5872*67e74705SXin Li 
5873*67e74705SXin Li   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5874*67e74705SXin Li     QualType NamedT = ElabT->getNamedType();
5875*67e74705SXin Li 
5876*67e74705SXin Li     // Copy information relevant to the template specialization.
5877*67e74705SXin Li     TemplateSpecializationTypeLoc NamedTL
5878*67e74705SXin Li       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5879*67e74705SXin Li     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5880*67e74705SXin Li     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5881*67e74705SXin Li     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5882*67e74705SXin Li     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5883*67e74705SXin Li     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5884*67e74705SXin Li       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5885*67e74705SXin Li 
5886*67e74705SXin Li     // Copy information relevant to the elaborated type.
5887*67e74705SXin Li     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5888*67e74705SXin Li     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5889*67e74705SXin Li     NewTL.setQualifierLoc(QualifierLoc);
5890*67e74705SXin Li   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5891*67e74705SXin Li     DependentTemplateSpecializationTypeLoc SpecTL
5892*67e74705SXin Li       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5893*67e74705SXin Li     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5894*67e74705SXin Li     SpecTL.setQualifierLoc(QualifierLoc);
5895*67e74705SXin Li     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5896*67e74705SXin Li     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5897*67e74705SXin Li     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5898*67e74705SXin Li     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5899*67e74705SXin Li     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5900*67e74705SXin Li       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5901*67e74705SXin Li   } else {
5902*67e74705SXin Li     TemplateSpecializationTypeLoc SpecTL
5903*67e74705SXin Li       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5904*67e74705SXin Li     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5905*67e74705SXin Li     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5906*67e74705SXin Li     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5907*67e74705SXin Li     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5908*67e74705SXin Li     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5909*67e74705SXin Li       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5910*67e74705SXin Li   }
5911*67e74705SXin Li   return Result;
5912*67e74705SXin Li }
5913*67e74705SXin Li 
5914*67e74705SXin Li template<typename Derived>
TransformPackExpansionType(TypeLocBuilder & TLB,PackExpansionTypeLoc TL)5915*67e74705SXin Li QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5916*67e74705SXin Li                                                       PackExpansionTypeLoc TL) {
5917*67e74705SXin Li   QualType Pattern
5918*67e74705SXin Li     = getDerived().TransformType(TLB, TL.getPatternLoc());
5919*67e74705SXin Li   if (Pattern.isNull())
5920*67e74705SXin Li     return QualType();
5921*67e74705SXin Li 
5922*67e74705SXin Li   QualType Result = TL.getType();
5923*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
5924*67e74705SXin Li       Pattern != TL.getPatternLoc().getType()) {
5925*67e74705SXin Li     Result = getDerived().RebuildPackExpansionType(Pattern,
5926*67e74705SXin Li                                            TL.getPatternLoc().getSourceRange(),
5927*67e74705SXin Li                                                    TL.getEllipsisLoc(),
5928*67e74705SXin Li                                            TL.getTypePtr()->getNumExpansions());
5929*67e74705SXin Li     if (Result.isNull())
5930*67e74705SXin Li       return QualType();
5931*67e74705SXin Li   }
5932*67e74705SXin Li 
5933*67e74705SXin Li   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5934*67e74705SXin Li   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5935*67e74705SXin Li   return Result;
5936*67e74705SXin Li }
5937*67e74705SXin Li 
5938*67e74705SXin Li template<typename Derived>
5939*67e74705SXin Li QualType
TransformObjCInterfaceType(TypeLocBuilder & TLB,ObjCInterfaceTypeLoc TL)5940*67e74705SXin Li TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5941*67e74705SXin Li                                                    ObjCInterfaceTypeLoc TL) {
5942*67e74705SXin Li   // ObjCInterfaceType is never dependent.
5943*67e74705SXin Li   TLB.pushFullCopy(TL);
5944*67e74705SXin Li   return TL.getType();
5945*67e74705SXin Li }
5946*67e74705SXin Li 
5947*67e74705SXin Li template<typename Derived>
5948*67e74705SXin Li QualType
TransformObjCObjectType(TypeLocBuilder & TLB,ObjCObjectTypeLoc TL)5949*67e74705SXin Li TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5950*67e74705SXin Li                                                 ObjCObjectTypeLoc TL) {
5951*67e74705SXin Li   // Transform base type.
5952*67e74705SXin Li   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
5953*67e74705SXin Li   if (BaseType.isNull())
5954*67e74705SXin Li     return QualType();
5955*67e74705SXin Li 
5956*67e74705SXin Li   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
5957*67e74705SXin Li 
5958*67e74705SXin Li   // Transform type arguments.
5959*67e74705SXin Li   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
5960*67e74705SXin Li   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
5961*67e74705SXin Li     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
5962*67e74705SXin Li     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
5963*67e74705SXin Li     QualType TypeArg = TypeArgInfo->getType();
5964*67e74705SXin Li     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
5965*67e74705SXin Li       AnyChanged = true;
5966*67e74705SXin Li 
5967*67e74705SXin Li       // We have a pack expansion. Instantiate it.
5968*67e74705SXin Li       const auto *PackExpansion = PackExpansionLoc.getType()
5969*67e74705SXin Li                                     ->castAs<PackExpansionType>();
5970*67e74705SXin Li       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5971*67e74705SXin Li       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5972*67e74705SXin Li                                               Unexpanded);
5973*67e74705SXin Li       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5974*67e74705SXin Li 
5975*67e74705SXin Li       // Determine whether the set of unexpanded parameter packs can
5976*67e74705SXin Li       // and should be expanded.
5977*67e74705SXin Li       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
5978*67e74705SXin Li       bool Expand = false;
5979*67e74705SXin Li       bool RetainExpansion = false;
5980*67e74705SXin Li       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5981*67e74705SXin Li       if (getDerived().TryExpandParameterPacks(
5982*67e74705SXin Li             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
5983*67e74705SXin Li             Unexpanded, Expand, RetainExpansion, NumExpansions))
5984*67e74705SXin Li         return QualType();
5985*67e74705SXin Li 
5986*67e74705SXin Li       if (!Expand) {
5987*67e74705SXin Li         // We can't expand this pack expansion into separate arguments yet;
5988*67e74705SXin Li         // just substitute into the pattern and create a new pack expansion
5989*67e74705SXin Li         // type.
5990*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5991*67e74705SXin Li 
5992*67e74705SXin Li         TypeLocBuilder TypeArgBuilder;
5993*67e74705SXin Li         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
5994*67e74705SXin Li         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
5995*67e74705SXin Li                                                              PatternLoc);
5996*67e74705SXin Li         if (NewPatternType.isNull())
5997*67e74705SXin Li           return QualType();
5998*67e74705SXin Li 
5999*67e74705SXin Li         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6000*67e74705SXin Li                                       NewPatternType, NumExpansions);
6001*67e74705SXin Li         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6002*67e74705SXin Li         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6003*67e74705SXin Li         NewTypeArgInfos.push_back(
6004*67e74705SXin Li           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6005*67e74705SXin Li         continue;
6006*67e74705SXin Li       }
6007*67e74705SXin Li 
6008*67e74705SXin Li       // Substitute into the pack expansion pattern for each slice of the
6009*67e74705SXin Li       // pack.
6010*67e74705SXin Li       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6011*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6012*67e74705SXin Li 
6013*67e74705SXin Li         TypeLocBuilder TypeArgBuilder;
6014*67e74705SXin Li         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6015*67e74705SXin Li 
6016*67e74705SXin Li         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6017*67e74705SXin Li                                                          PatternLoc);
6018*67e74705SXin Li         if (NewTypeArg.isNull())
6019*67e74705SXin Li           return QualType();
6020*67e74705SXin Li 
6021*67e74705SXin Li         NewTypeArgInfos.push_back(
6022*67e74705SXin Li           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6023*67e74705SXin Li       }
6024*67e74705SXin Li 
6025*67e74705SXin Li       continue;
6026*67e74705SXin Li     }
6027*67e74705SXin Li 
6028*67e74705SXin Li     TypeLocBuilder TypeArgBuilder;
6029*67e74705SXin Li     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6030*67e74705SXin Li     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6031*67e74705SXin Li     if (NewTypeArg.isNull())
6032*67e74705SXin Li       return QualType();
6033*67e74705SXin Li 
6034*67e74705SXin Li     // If nothing changed, just keep the old TypeSourceInfo.
6035*67e74705SXin Li     if (NewTypeArg == TypeArg) {
6036*67e74705SXin Li       NewTypeArgInfos.push_back(TypeArgInfo);
6037*67e74705SXin Li       continue;
6038*67e74705SXin Li     }
6039*67e74705SXin Li 
6040*67e74705SXin Li     NewTypeArgInfos.push_back(
6041*67e74705SXin Li       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6042*67e74705SXin Li     AnyChanged = true;
6043*67e74705SXin Li   }
6044*67e74705SXin Li 
6045*67e74705SXin Li   QualType Result = TL.getType();
6046*67e74705SXin Li   if (getDerived().AlwaysRebuild() || AnyChanged) {
6047*67e74705SXin Li     // Rebuild the type.
6048*67e74705SXin Li     Result = getDerived().RebuildObjCObjectType(
6049*67e74705SXin Li                BaseType,
6050*67e74705SXin Li                TL.getLocStart(),
6051*67e74705SXin Li                TL.getTypeArgsLAngleLoc(),
6052*67e74705SXin Li                NewTypeArgInfos,
6053*67e74705SXin Li                TL.getTypeArgsRAngleLoc(),
6054*67e74705SXin Li                TL.getProtocolLAngleLoc(),
6055*67e74705SXin Li                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6056*67e74705SXin Li                                   TL.getNumProtocols()),
6057*67e74705SXin Li                TL.getProtocolLocs(),
6058*67e74705SXin Li                TL.getProtocolRAngleLoc());
6059*67e74705SXin Li 
6060*67e74705SXin Li     if (Result.isNull())
6061*67e74705SXin Li       return QualType();
6062*67e74705SXin Li   }
6063*67e74705SXin Li 
6064*67e74705SXin Li   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6065*67e74705SXin Li   NewT.setHasBaseTypeAsWritten(true);
6066*67e74705SXin Li   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6067*67e74705SXin Li   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6068*67e74705SXin Li     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6069*67e74705SXin Li   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6070*67e74705SXin Li   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6071*67e74705SXin Li   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6072*67e74705SXin Li     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6073*67e74705SXin Li   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6074*67e74705SXin Li   return Result;
6075*67e74705SXin Li }
6076*67e74705SXin Li 
6077*67e74705SXin Li template<typename Derived>
6078*67e74705SXin Li QualType
TransformObjCObjectPointerType(TypeLocBuilder & TLB,ObjCObjectPointerTypeLoc TL)6079*67e74705SXin Li TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6080*67e74705SXin Li                                                ObjCObjectPointerTypeLoc TL) {
6081*67e74705SXin Li   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6082*67e74705SXin Li   if (PointeeType.isNull())
6083*67e74705SXin Li     return QualType();
6084*67e74705SXin Li 
6085*67e74705SXin Li   QualType Result = TL.getType();
6086*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
6087*67e74705SXin Li       PointeeType != TL.getPointeeLoc().getType()) {
6088*67e74705SXin Li     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6089*67e74705SXin Li                                                        TL.getStarLoc());
6090*67e74705SXin Li     if (Result.isNull())
6091*67e74705SXin Li       return QualType();
6092*67e74705SXin Li   }
6093*67e74705SXin Li 
6094*67e74705SXin Li   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6095*67e74705SXin Li   NewT.setStarLoc(TL.getStarLoc());
6096*67e74705SXin Li   return Result;
6097*67e74705SXin Li }
6098*67e74705SXin Li 
6099*67e74705SXin Li //===----------------------------------------------------------------------===//
6100*67e74705SXin Li // Statement transformation
6101*67e74705SXin Li //===----------------------------------------------------------------------===//
6102*67e74705SXin Li template<typename Derived>
6103*67e74705SXin Li StmtResult
TransformNullStmt(NullStmt * S)6104*67e74705SXin Li TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6105*67e74705SXin Li   return S;
6106*67e74705SXin Li }
6107*67e74705SXin Li 
6108*67e74705SXin Li template<typename Derived>
6109*67e74705SXin Li StmtResult
TransformCompoundStmt(CompoundStmt * S)6110*67e74705SXin Li TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6111*67e74705SXin Li   return getDerived().TransformCompoundStmt(S, false);
6112*67e74705SXin Li }
6113*67e74705SXin Li 
6114*67e74705SXin Li template<typename Derived>
6115*67e74705SXin Li StmtResult
TransformCompoundStmt(CompoundStmt * S,bool IsStmtExpr)6116*67e74705SXin Li TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6117*67e74705SXin Li                                               bool IsStmtExpr) {
6118*67e74705SXin Li   Sema::CompoundScopeRAII CompoundScope(getSema());
6119*67e74705SXin Li 
6120*67e74705SXin Li   bool SubStmtInvalid = false;
6121*67e74705SXin Li   bool SubStmtChanged = false;
6122*67e74705SXin Li   SmallVector<Stmt*, 8> Statements;
6123*67e74705SXin Li   for (auto *B : S->body()) {
6124*67e74705SXin Li     StmtResult Result = getDerived().TransformStmt(B);
6125*67e74705SXin Li     if (Result.isInvalid()) {
6126*67e74705SXin Li       // Immediately fail if this was a DeclStmt, since it's very
6127*67e74705SXin Li       // likely that this will cause problems for future statements.
6128*67e74705SXin Li       if (isa<DeclStmt>(B))
6129*67e74705SXin Li         return StmtError();
6130*67e74705SXin Li 
6131*67e74705SXin Li       // Otherwise, just keep processing substatements and fail later.
6132*67e74705SXin Li       SubStmtInvalid = true;
6133*67e74705SXin Li       continue;
6134*67e74705SXin Li     }
6135*67e74705SXin Li 
6136*67e74705SXin Li     SubStmtChanged = SubStmtChanged || Result.get() != B;
6137*67e74705SXin Li     Statements.push_back(Result.getAs<Stmt>());
6138*67e74705SXin Li   }
6139*67e74705SXin Li 
6140*67e74705SXin Li   if (SubStmtInvalid)
6141*67e74705SXin Li     return StmtError();
6142*67e74705SXin Li 
6143*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6144*67e74705SXin Li       !SubStmtChanged)
6145*67e74705SXin Li     return S;
6146*67e74705SXin Li 
6147*67e74705SXin Li   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6148*67e74705SXin Li                                           Statements,
6149*67e74705SXin Li                                           S->getRBracLoc(),
6150*67e74705SXin Li                                           IsStmtExpr);
6151*67e74705SXin Li }
6152*67e74705SXin Li 
6153*67e74705SXin Li template<typename Derived>
6154*67e74705SXin Li StmtResult
TransformCaseStmt(CaseStmt * S)6155*67e74705SXin Li TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6156*67e74705SXin Li   ExprResult LHS, RHS;
6157*67e74705SXin Li   {
6158*67e74705SXin Li     EnterExpressionEvaluationContext Unevaluated(SemaRef,
6159*67e74705SXin Li                                                  Sema::ConstantEvaluated);
6160*67e74705SXin Li 
6161*67e74705SXin Li     // Transform the left-hand case value.
6162*67e74705SXin Li     LHS = getDerived().TransformExpr(S->getLHS());
6163*67e74705SXin Li     LHS = SemaRef.ActOnConstantExpression(LHS);
6164*67e74705SXin Li     if (LHS.isInvalid())
6165*67e74705SXin Li       return StmtError();
6166*67e74705SXin Li 
6167*67e74705SXin Li     // Transform the right-hand case value (for the GNU case-range extension).
6168*67e74705SXin Li     RHS = getDerived().TransformExpr(S->getRHS());
6169*67e74705SXin Li     RHS = SemaRef.ActOnConstantExpression(RHS);
6170*67e74705SXin Li     if (RHS.isInvalid())
6171*67e74705SXin Li       return StmtError();
6172*67e74705SXin Li   }
6173*67e74705SXin Li 
6174*67e74705SXin Li   // Build the case statement.
6175*67e74705SXin Li   // Case statements are always rebuilt so that they will attached to their
6176*67e74705SXin Li   // transformed switch statement.
6177*67e74705SXin Li   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6178*67e74705SXin Li                                                        LHS.get(),
6179*67e74705SXin Li                                                        S->getEllipsisLoc(),
6180*67e74705SXin Li                                                        RHS.get(),
6181*67e74705SXin Li                                                        S->getColonLoc());
6182*67e74705SXin Li   if (Case.isInvalid())
6183*67e74705SXin Li     return StmtError();
6184*67e74705SXin Li 
6185*67e74705SXin Li   // Transform the statement following the case
6186*67e74705SXin Li   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6187*67e74705SXin Li   if (SubStmt.isInvalid())
6188*67e74705SXin Li     return StmtError();
6189*67e74705SXin Li 
6190*67e74705SXin Li   // Attach the body to the case statement
6191*67e74705SXin Li   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6192*67e74705SXin Li }
6193*67e74705SXin Li 
6194*67e74705SXin Li template<typename Derived>
6195*67e74705SXin Li StmtResult
TransformDefaultStmt(DefaultStmt * S)6196*67e74705SXin Li TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6197*67e74705SXin Li   // Transform the statement following the default case
6198*67e74705SXin Li   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6199*67e74705SXin Li   if (SubStmt.isInvalid())
6200*67e74705SXin Li     return StmtError();
6201*67e74705SXin Li 
6202*67e74705SXin Li   // Default statements are always rebuilt
6203*67e74705SXin Li   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6204*67e74705SXin Li                                          SubStmt.get());
6205*67e74705SXin Li }
6206*67e74705SXin Li 
6207*67e74705SXin Li template<typename Derived>
6208*67e74705SXin Li StmtResult
TransformLabelStmt(LabelStmt * S)6209*67e74705SXin Li TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6210*67e74705SXin Li   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6211*67e74705SXin Li   if (SubStmt.isInvalid())
6212*67e74705SXin Li     return StmtError();
6213*67e74705SXin Li 
6214*67e74705SXin Li   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6215*67e74705SXin Li                                         S->getDecl());
6216*67e74705SXin Li   if (!LD)
6217*67e74705SXin Li     return StmtError();
6218*67e74705SXin Li 
6219*67e74705SXin Li 
6220*67e74705SXin Li   // FIXME: Pass the real colon location in.
6221*67e74705SXin Li   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6222*67e74705SXin Li                                        cast<LabelDecl>(LD), SourceLocation(),
6223*67e74705SXin Li                                        SubStmt.get());
6224*67e74705SXin Li }
6225*67e74705SXin Li 
6226*67e74705SXin Li template <typename Derived>
TransformAttr(const Attr * R)6227*67e74705SXin Li const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6228*67e74705SXin Li   if (!R)
6229*67e74705SXin Li     return R;
6230*67e74705SXin Li 
6231*67e74705SXin Li   switch (R->getKind()) {
6232*67e74705SXin Li // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6233*67e74705SXin Li #define ATTR(X)
6234*67e74705SXin Li #define PRAGMA_SPELLING_ATTR(X)                                                \
6235*67e74705SXin Li   case attr::X:                                                                \
6236*67e74705SXin Li     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6237*67e74705SXin Li #include "clang/Basic/AttrList.inc"
6238*67e74705SXin Li   default:
6239*67e74705SXin Li     return R;
6240*67e74705SXin Li   }
6241*67e74705SXin Li }
6242*67e74705SXin Li 
6243*67e74705SXin Li template <typename Derived>
TransformAttributedStmt(AttributedStmt * S)6244*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6245*67e74705SXin Li   bool AttrsChanged = false;
6246*67e74705SXin Li   SmallVector<const Attr *, 1> Attrs;
6247*67e74705SXin Li 
6248*67e74705SXin Li   // Visit attributes and keep track if any are transformed.
6249*67e74705SXin Li   for (const auto *I : S->getAttrs()) {
6250*67e74705SXin Li     const Attr *R = getDerived().TransformAttr(I);
6251*67e74705SXin Li     AttrsChanged |= (I != R);
6252*67e74705SXin Li     Attrs.push_back(R);
6253*67e74705SXin Li   }
6254*67e74705SXin Li 
6255*67e74705SXin Li   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6256*67e74705SXin Li   if (SubStmt.isInvalid())
6257*67e74705SXin Li     return StmtError();
6258*67e74705SXin Li 
6259*67e74705SXin Li   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6260*67e74705SXin Li     return S;
6261*67e74705SXin Li 
6262*67e74705SXin Li   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6263*67e74705SXin Li                                             SubStmt.get());
6264*67e74705SXin Li }
6265*67e74705SXin Li 
6266*67e74705SXin Li template<typename Derived>
6267*67e74705SXin Li StmtResult
TransformIfStmt(IfStmt * S)6268*67e74705SXin Li TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6269*67e74705SXin Li   // Transform the initialization statement
6270*67e74705SXin Li   StmtResult Init = getDerived().TransformStmt(S->getInit());
6271*67e74705SXin Li   if (Init.isInvalid())
6272*67e74705SXin Li     return StmtError();
6273*67e74705SXin Li 
6274*67e74705SXin Li   // Transform the condition
6275*67e74705SXin Li   Sema::ConditionResult Cond = getDerived().TransformCondition(
6276*67e74705SXin Li       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6277*67e74705SXin Li       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6278*67e74705SXin Li                        : Sema::ConditionKind::Boolean);
6279*67e74705SXin Li   if (Cond.isInvalid())
6280*67e74705SXin Li     return StmtError();
6281*67e74705SXin Li 
6282*67e74705SXin Li   // If this is a constexpr if, determine which arm we should instantiate.
6283*67e74705SXin Li   llvm::Optional<bool> ConstexprConditionValue;
6284*67e74705SXin Li   if (S->isConstexpr())
6285*67e74705SXin Li     ConstexprConditionValue = Cond.getKnownValue();
6286*67e74705SXin Li 
6287*67e74705SXin Li   // Transform the "then" branch.
6288*67e74705SXin Li   StmtResult Then;
6289*67e74705SXin Li   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6290*67e74705SXin Li     Then = getDerived().TransformStmt(S->getThen());
6291*67e74705SXin Li     if (Then.isInvalid())
6292*67e74705SXin Li       return StmtError();
6293*67e74705SXin Li   } else {
6294*67e74705SXin Li     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6295*67e74705SXin Li   }
6296*67e74705SXin Li 
6297*67e74705SXin Li   // Transform the "else" branch.
6298*67e74705SXin Li   StmtResult Else;
6299*67e74705SXin Li   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6300*67e74705SXin Li     Else = getDerived().TransformStmt(S->getElse());
6301*67e74705SXin Li     if (Else.isInvalid())
6302*67e74705SXin Li       return StmtError();
6303*67e74705SXin Li   }
6304*67e74705SXin Li 
6305*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6306*67e74705SXin Li       Init.get() == S->getInit() &&
6307*67e74705SXin Li       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6308*67e74705SXin Li       Then.get() == S->getThen() &&
6309*67e74705SXin Li       Else.get() == S->getElse())
6310*67e74705SXin Li     return S;
6311*67e74705SXin Li 
6312*67e74705SXin Li   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6313*67e74705SXin Li                                     Init.get(), Then.get(), S->getElseLoc(),
6314*67e74705SXin Li                                     Else.get());
6315*67e74705SXin Li }
6316*67e74705SXin Li 
6317*67e74705SXin Li template<typename Derived>
6318*67e74705SXin Li StmtResult
TransformSwitchStmt(SwitchStmt * S)6319*67e74705SXin Li TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6320*67e74705SXin Li   // Transform the initialization statement
6321*67e74705SXin Li   StmtResult Init = getDerived().TransformStmt(S->getInit());
6322*67e74705SXin Li   if (Init.isInvalid())
6323*67e74705SXin Li     return StmtError();
6324*67e74705SXin Li 
6325*67e74705SXin Li   // Transform the condition.
6326*67e74705SXin Li   Sema::ConditionResult Cond = getDerived().TransformCondition(
6327*67e74705SXin Li       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6328*67e74705SXin Li       Sema::ConditionKind::Switch);
6329*67e74705SXin Li   if (Cond.isInvalid())
6330*67e74705SXin Li     return StmtError();
6331*67e74705SXin Li 
6332*67e74705SXin Li   // Rebuild the switch statement.
6333*67e74705SXin Li   StmtResult Switch
6334*67e74705SXin Li     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(),
6335*67e74705SXin Li                                           S->getInit(), Cond);
6336*67e74705SXin Li   if (Switch.isInvalid())
6337*67e74705SXin Li     return StmtError();
6338*67e74705SXin Li 
6339*67e74705SXin Li   // Transform the body of the switch statement.
6340*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getBody());
6341*67e74705SXin Li   if (Body.isInvalid())
6342*67e74705SXin Li     return StmtError();
6343*67e74705SXin Li 
6344*67e74705SXin Li   // Complete the switch statement.
6345*67e74705SXin Li   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6346*67e74705SXin Li                                             Body.get());
6347*67e74705SXin Li }
6348*67e74705SXin Li 
6349*67e74705SXin Li template<typename Derived>
6350*67e74705SXin Li StmtResult
TransformWhileStmt(WhileStmt * S)6351*67e74705SXin Li TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6352*67e74705SXin Li   // Transform the condition
6353*67e74705SXin Li   Sema::ConditionResult Cond = getDerived().TransformCondition(
6354*67e74705SXin Li       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6355*67e74705SXin Li       Sema::ConditionKind::Boolean);
6356*67e74705SXin Li   if (Cond.isInvalid())
6357*67e74705SXin Li     return StmtError();
6358*67e74705SXin Li 
6359*67e74705SXin Li   // Transform the body
6360*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getBody());
6361*67e74705SXin Li   if (Body.isInvalid())
6362*67e74705SXin Li     return StmtError();
6363*67e74705SXin Li 
6364*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6365*67e74705SXin Li       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6366*67e74705SXin Li       Body.get() == S->getBody())
6367*67e74705SXin Li     return Owned(S);
6368*67e74705SXin Li 
6369*67e74705SXin Li   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6370*67e74705SXin Li }
6371*67e74705SXin Li 
6372*67e74705SXin Li template<typename Derived>
6373*67e74705SXin Li StmtResult
TransformDoStmt(DoStmt * S)6374*67e74705SXin Li TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6375*67e74705SXin Li   // Transform the body
6376*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getBody());
6377*67e74705SXin Li   if (Body.isInvalid())
6378*67e74705SXin Li     return StmtError();
6379*67e74705SXin Li 
6380*67e74705SXin Li   // Transform the condition
6381*67e74705SXin Li   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6382*67e74705SXin Li   if (Cond.isInvalid())
6383*67e74705SXin Li     return StmtError();
6384*67e74705SXin Li 
6385*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6386*67e74705SXin Li       Cond.get() == S->getCond() &&
6387*67e74705SXin Li       Body.get() == S->getBody())
6388*67e74705SXin Li     return S;
6389*67e74705SXin Li 
6390*67e74705SXin Li   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6391*67e74705SXin Li                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6392*67e74705SXin Li                                     S->getRParenLoc());
6393*67e74705SXin Li }
6394*67e74705SXin Li 
6395*67e74705SXin Li template<typename Derived>
6396*67e74705SXin Li StmtResult
TransformForStmt(ForStmt * S)6397*67e74705SXin Li TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6398*67e74705SXin Li   // Transform the initialization statement
6399*67e74705SXin Li   StmtResult Init = getDerived().TransformStmt(S->getInit());
6400*67e74705SXin Li   if (Init.isInvalid())
6401*67e74705SXin Li     return StmtError();
6402*67e74705SXin Li 
6403*67e74705SXin Li   // In OpenMP loop region loop control variable must be captured and be
6404*67e74705SXin Li   // private. Perform analysis of first part (if any).
6405*67e74705SXin Li   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6406*67e74705SXin Li     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6407*67e74705SXin Li 
6408*67e74705SXin Li   // Transform the condition
6409*67e74705SXin Li   Sema::ConditionResult Cond = getDerived().TransformCondition(
6410*67e74705SXin Li       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6411*67e74705SXin Li       Sema::ConditionKind::Boolean);
6412*67e74705SXin Li   if (Cond.isInvalid())
6413*67e74705SXin Li     return StmtError();
6414*67e74705SXin Li 
6415*67e74705SXin Li   // Transform the increment
6416*67e74705SXin Li   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6417*67e74705SXin Li   if (Inc.isInvalid())
6418*67e74705SXin Li     return StmtError();
6419*67e74705SXin Li 
6420*67e74705SXin Li   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6421*67e74705SXin Li   if (S->getInc() && !FullInc.get())
6422*67e74705SXin Li     return StmtError();
6423*67e74705SXin Li 
6424*67e74705SXin Li   // Transform the body
6425*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getBody());
6426*67e74705SXin Li   if (Body.isInvalid())
6427*67e74705SXin Li     return StmtError();
6428*67e74705SXin Li 
6429*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6430*67e74705SXin Li       Init.get() == S->getInit() &&
6431*67e74705SXin Li       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6432*67e74705SXin Li       Inc.get() == S->getInc() &&
6433*67e74705SXin Li       Body.get() == S->getBody())
6434*67e74705SXin Li     return S;
6435*67e74705SXin Li 
6436*67e74705SXin Li   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6437*67e74705SXin Li                                      Init.get(), Cond, FullInc,
6438*67e74705SXin Li                                      S->getRParenLoc(), Body.get());
6439*67e74705SXin Li }
6440*67e74705SXin Li 
6441*67e74705SXin Li template<typename Derived>
6442*67e74705SXin Li StmtResult
TransformGotoStmt(GotoStmt * S)6443*67e74705SXin Li TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6444*67e74705SXin Li   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6445*67e74705SXin Li                                         S->getLabel());
6446*67e74705SXin Li   if (!LD)
6447*67e74705SXin Li     return StmtError();
6448*67e74705SXin Li 
6449*67e74705SXin Li   // Goto statements must always be rebuilt, to resolve the label.
6450*67e74705SXin Li   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6451*67e74705SXin Li                                       cast<LabelDecl>(LD));
6452*67e74705SXin Li }
6453*67e74705SXin Li 
6454*67e74705SXin Li template<typename Derived>
6455*67e74705SXin Li StmtResult
TransformIndirectGotoStmt(IndirectGotoStmt * S)6456*67e74705SXin Li TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6457*67e74705SXin Li   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6458*67e74705SXin Li   if (Target.isInvalid())
6459*67e74705SXin Li     return StmtError();
6460*67e74705SXin Li   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6461*67e74705SXin Li 
6462*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6463*67e74705SXin Li       Target.get() == S->getTarget())
6464*67e74705SXin Li     return S;
6465*67e74705SXin Li 
6466*67e74705SXin Li   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6467*67e74705SXin Li                                               Target.get());
6468*67e74705SXin Li }
6469*67e74705SXin Li 
6470*67e74705SXin Li template<typename Derived>
6471*67e74705SXin Li StmtResult
TransformContinueStmt(ContinueStmt * S)6472*67e74705SXin Li TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6473*67e74705SXin Li   return S;
6474*67e74705SXin Li }
6475*67e74705SXin Li 
6476*67e74705SXin Li template<typename Derived>
6477*67e74705SXin Li StmtResult
TransformBreakStmt(BreakStmt * S)6478*67e74705SXin Li TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6479*67e74705SXin Li   return S;
6480*67e74705SXin Li }
6481*67e74705SXin Li 
6482*67e74705SXin Li template<typename Derived>
6483*67e74705SXin Li StmtResult
TransformReturnStmt(ReturnStmt * S)6484*67e74705SXin Li TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6485*67e74705SXin Li   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6486*67e74705SXin Li                                                         /*NotCopyInit*/false);
6487*67e74705SXin Li   if (Result.isInvalid())
6488*67e74705SXin Li     return StmtError();
6489*67e74705SXin Li 
6490*67e74705SXin Li   // FIXME: We always rebuild the return statement because there is no way
6491*67e74705SXin Li   // to tell whether the return type of the function has changed.
6492*67e74705SXin Li   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6493*67e74705SXin Li }
6494*67e74705SXin Li 
6495*67e74705SXin Li template<typename Derived>
6496*67e74705SXin Li StmtResult
TransformDeclStmt(DeclStmt * S)6497*67e74705SXin Li TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6498*67e74705SXin Li   bool DeclChanged = false;
6499*67e74705SXin Li   SmallVector<Decl *, 4> Decls;
6500*67e74705SXin Li   for (auto *D : S->decls()) {
6501*67e74705SXin Li     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6502*67e74705SXin Li     if (!Transformed)
6503*67e74705SXin Li       return StmtError();
6504*67e74705SXin Li 
6505*67e74705SXin Li     if (Transformed != D)
6506*67e74705SXin Li       DeclChanged = true;
6507*67e74705SXin Li 
6508*67e74705SXin Li     Decls.push_back(Transformed);
6509*67e74705SXin Li   }
6510*67e74705SXin Li 
6511*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6512*67e74705SXin Li     return S;
6513*67e74705SXin Li 
6514*67e74705SXin Li   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6515*67e74705SXin Li }
6516*67e74705SXin Li 
6517*67e74705SXin Li template<typename Derived>
6518*67e74705SXin Li StmtResult
TransformGCCAsmStmt(GCCAsmStmt * S)6519*67e74705SXin Li TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6520*67e74705SXin Li 
6521*67e74705SXin Li   SmallVector<Expr*, 8> Constraints;
6522*67e74705SXin Li   SmallVector<Expr*, 8> Exprs;
6523*67e74705SXin Li   SmallVector<IdentifierInfo *, 4> Names;
6524*67e74705SXin Li 
6525*67e74705SXin Li   ExprResult AsmString;
6526*67e74705SXin Li   SmallVector<Expr*, 8> Clobbers;
6527*67e74705SXin Li 
6528*67e74705SXin Li   bool ExprsChanged = false;
6529*67e74705SXin Li 
6530*67e74705SXin Li   // Go through the outputs.
6531*67e74705SXin Li   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6532*67e74705SXin Li     Names.push_back(S->getOutputIdentifier(I));
6533*67e74705SXin Li 
6534*67e74705SXin Li     // No need to transform the constraint literal.
6535*67e74705SXin Li     Constraints.push_back(S->getOutputConstraintLiteral(I));
6536*67e74705SXin Li 
6537*67e74705SXin Li     // Transform the output expr.
6538*67e74705SXin Li     Expr *OutputExpr = S->getOutputExpr(I);
6539*67e74705SXin Li     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6540*67e74705SXin Li     if (Result.isInvalid())
6541*67e74705SXin Li       return StmtError();
6542*67e74705SXin Li 
6543*67e74705SXin Li     ExprsChanged |= Result.get() != OutputExpr;
6544*67e74705SXin Li 
6545*67e74705SXin Li     Exprs.push_back(Result.get());
6546*67e74705SXin Li   }
6547*67e74705SXin Li 
6548*67e74705SXin Li   // Go through the inputs.
6549*67e74705SXin Li   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6550*67e74705SXin Li     Names.push_back(S->getInputIdentifier(I));
6551*67e74705SXin Li 
6552*67e74705SXin Li     // No need to transform the constraint literal.
6553*67e74705SXin Li     Constraints.push_back(S->getInputConstraintLiteral(I));
6554*67e74705SXin Li 
6555*67e74705SXin Li     // Transform the input expr.
6556*67e74705SXin Li     Expr *InputExpr = S->getInputExpr(I);
6557*67e74705SXin Li     ExprResult Result = getDerived().TransformExpr(InputExpr);
6558*67e74705SXin Li     if (Result.isInvalid())
6559*67e74705SXin Li       return StmtError();
6560*67e74705SXin Li 
6561*67e74705SXin Li     ExprsChanged |= Result.get() != InputExpr;
6562*67e74705SXin Li 
6563*67e74705SXin Li     Exprs.push_back(Result.get());
6564*67e74705SXin Li   }
6565*67e74705SXin Li 
6566*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6567*67e74705SXin Li     return S;
6568*67e74705SXin Li 
6569*67e74705SXin Li   // Go through the clobbers.
6570*67e74705SXin Li   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6571*67e74705SXin Li     Clobbers.push_back(S->getClobberStringLiteral(I));
6572*67e74705SXin Li 
6573*67e74705SXin Li   // No need to transform the asm string literal.
6574*67e74705SXin Li   AsmString = S->getAsmString();
6575*67e74705SXin Li   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6576*67e74705SXin Li                                         S->isVolatile(), S->getNumOutputs(),
6577*67e74705SXin Li                                         S->getNumInputs(), Names.data(),
6578*67e74705SXin Li                                         Constraints, Exprs, AsmString.get(),
6579*67e74705SXin Li                                         Clobbers, S->getRParenLoc());
6580*67e74705SXin Li }
6581*67e74705SXin Li 
6582*67e74705SXin Li template<typename Derived>
6583*67e74705SXin Li StmtResult
TransformMSAsmStmt(MSAsmStmt * S)6584*67e74705SXin Li TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6585*67e74705SXin Li   ArrayRef<Token> AsmToks =
6586*67e74705SXin Li     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6587*67e74705SXin Li 
6588*67e74705SXin Li   bool HadError = false, HadChange = false;
6589*67e74705SXin Li 
6590*67e74705SXin Li   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6591*67e74705SXin Li   SmallVector<Expr*, 8> TransformedExprs;
6592*67e74705SXin Li   TransformedExprs.reserve(SrcExprs.size());
6593*67e74705SXin Li   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6594*67e74705SXin Li     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6595*67e74705SXin Li     if (!Result.isUsable()) {
6596*67e74705SXin Li       HadError = true;
6597*67e74705SXin Li     } else {
6598*67e74705SXin Li       HadChange |= (Result.get() != SrcExprs[i]);
6599*67e74705SXin Li       TransformedExprs.push_back(Result.get());
6600*67e74705SXin Li     }
6601*67e74705SXin Li   }
6602*67e74705SXin Li 
6603*67e74705SXin Li   if (HadError) return StmtError();
6604*67e74705SXin Li   if (!HadChange && !getDerived().AlwaysRebuild())
6605*67e74705SXin Li     return Owned(S);
6606*67e74705SXin Li 
6607*67e74705SXin Li   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6608*67e74705SXin Li                                        AsmToks, S->getAsmString(),
6609*67e74705SXin Li                                        S->getNumOutputs(), S->getNumInputs(),
6610*67e74705SXin Li                                        S->getAllConstraints(), S->getClobbers(),
6611*67e74705SXin Li                                        TransformedExprs, S->getEndLoc());
6612*67e74705SXin Li }
6613*67e74705SXin Li 
6614*67e74705SXin Li // C++ Coroutines TS
6615*67e74705SXin Li 
6616*67e74705SXin Li template<typename Derived>
6617*67e74705SXin Li StmtResult
TransformCoroutineBodyStmt(CoroutineBodyStmt * S)6618*67e74705SXin Li TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6619*67e74705SXin Li   // The coroutine body should be re-formed by the caller if necessary.
6620*67e74705SXin Li   return getDerived().TransformStmt(S->getBody());
6621*67e74705SXin Li }
6622*67e74705SXin Li 
6623*67e74705SXin Li template<typename Derived>
6624*67e74705SXin Li StmtResult
TransformCoreturnStmt(CoreturnStmt * S)6625*67e74705SXin Li TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
6626*67e74705SXin Li   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
6627*67e74705SXin Li                                                         /*NotCopyInit*/false);
6628*67e74705SXin Li   if (Result.isInvalid())
6629*67e74705SXin Li     return StmtError();
6630*67e74705SXin Li 
6631*67e74705SXin Li   // Always rebuild; we don't know if this needs to be injected into a new
6632*67e74705SXin Li   // context or if the promise type has changed.
6633*67e74705SXin Li   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get());
6634*67e74705SXin Li }
6635*67e74705SXin Li 
6636*67e74705SXin Li template<typename Derived>
6637*67e74705SXin Li ExprResult
TransformCoawaitExpr(CoawaitExpr * E)6638*67e74705SXin Li TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
6639*67e74705SXin Li   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6640*67e74705SXin Li                                                         /*NotCopyInit*/false);
6641*67e74705SXin Li   if (Result.isInvalid())
6642*67e74705SXin Li     return ExprError();
6643*67e74705SXin Li 
6644*67e74705SXin Li   // Always rebuild; we don't know if this needs to be injected into a new
6645*67e74705SXin Li   // context or if the promise type has changed.
6646*67e74705SXin Li   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get());
6647*67e74705SXin Li }
6648*67e74705SXin Li 
6649*67e74705SXin Li template<typename Derived>
6650*67e74705SXin Li ExprResult
TransformCoyieldExpr(CoyieldExpr * E)6651*67e74705SXin Li TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
6652*67e74705SXin Li   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
6653*67e74705SXin Li                                                         /*NotCopyInit*/false);
6654*67e74705SXin Li   if (Result.isInvalid())
6655*67e74705SXin Li     return ExprError();
6656*67e74705SXin Li 
6657*67e74705SXin Li   // Always rebuild; we don't know if this needs to be injected into a new
6658*67e74705SXin Li   // context or if the promise type has changed.
6659*67e74705SXin Li   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
6660*67e74705SXin Li }
6661*67e74705SXin Li 
6662*67e74705SXin Li // Objective-C Statements.
6663*67e74705SXin Li 
6664*67e74705SXin Li template<typename Derived>
6665*67e74705SXin Li StmtResult
TransformObjCAtTryStmt(ObjCAtTryStmt * S)6666*67e74705SXin Li TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6667*67e74705SXin Li   // Transform the body of the @try.
6668*67e74705SXin Li   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6669*67e74705SXin Li   if (TryBody.isInvalid())
6670*67e74705SXin Li     return StmtError();
6671*67e74705SXin Li 
6672*67e74705SXin Li   // Transform the @catch statements (if present).
6673*67e74705SXin Li   bool AnyCatchChanged = false;
6674*67e74705SXin Li   SmallVector<Stmt*, 8> CatchStmts;
6675*67e74705SXin Li   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6676*67e74705SXin Li     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6677*67e74705SXin Li     if (Catch.isInvalid())
6678*67e74705SXin Li       return StmtError();
6679*67e74705SXin Li     if (Catch.get() != S->getCatchStmt(I))
6680*67e74705SXin Li       AnyCatchChanged = true;
6681*67e74705SXin Li     CatchStmts.push_back(Catch.get());
6682*67e74705SXin Li   }
6683*67e74705SXin Li 
6684*67e74705SXin Li   // Transform the @finally statement (if present).
6685*67e74705SXin Li   StmtResult Finally;
6686*67e74705SXin Li   if (S->getFinallyStmt()) {
6687*67e74705SXin Li     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6688*67e74705SXin Li     if (Finally.isInvalid())
6689*67e74705SXin Li       return StmtError();
6690*67e74705SXin Li   }
6691*67e74705SXin Li 
6692*67e74705SXin Li   // If nothing changed, just retain this statement.
6693*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6694*67e74705SXin Li       TryBody.get() == S->getTryBody() &&
6695*67e74705SXin Li       !AnyCatchChanged &&
6696*67e74705SXin Li       Finally.get() == S->getFinallyStmt())
6697*67e74705SXin Li     return S;
6698*67e74705SXin Li 
6699*67e74705SXin Li   // Build a new statement.
6700*67e74705SXin Li   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6701*67e74705SXin Li                                            CatchStmts, Finally.get());
6702*67e74705SXin Li }
6703*67e74705SXin Li 
6704*67e74705SXin Li template<typename Derived>
6705*67e74705SXin Li StmtResult
TransformObjCAtCatchStmt(ObjCAtCatchStmt * S)6706*67e74705SXin Li TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6707*67e74705SXin Li   // Transform the @catch parameter, if there is one.
6708*67e74705SXin Li   VarDecl *Var = nullptr;
6709*67e74705SXin Li   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6710*67e74705SXin Li     TypeSourceInfo *TSInfo = nullptr;
6711*67e74705SXin Li     if (FromVar->getTypeSourceInfo()) {
6712*67e74705SXin Li       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6713*67e74705SXin Li       if (!TSInfo)
6714*67e74705SXin Li         return StmtError();
6715*67e74705SXin Li     }
6716*67e74705SXin Li 
6717*67e74705SXin Li     QualType T;
6718*67e74705SXin Li     if (TSInfo)
6719*67e74705SXin Li       T = TSInfo->getType();
6720*67e74705SXin Li     else {
6721*67e74705SXin Li       T = getDerived().TransformType(FromVar->getType());
6722*67e74705SXin Li       if (T.isNull())
6723*67e74705SXin Li         return StmtError();
6724*67e74705SXin Li     }
6725*67e74705SXin Li 
6726*67e74705SXin Li     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6727*67e74705SXin Li     if (!Var)
6728*67e74705SXin Li       return StmtError();
6729*67e74705SXin Li   }
6730*67e74705SXin Li 
6731*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6732*67e74705SXin Li   if (Body.isInvalid())
6733*67e74705SXin Li     return StmtError();
6734*67e74705SXin Li 
6735*67e74705SXin Li   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6736*67e74705SXin Li                                              S->getRParenLoc(),
6737*67e74705SXin Li                                              Var, Body.get());
6738*67e74705SXin Li }
6739*67e74705SXin Li 
6740*67e74705SXin Li template<typename Derived>
6741*67e74705SXin Li StmtResult
TransformObjCAtFinallyStmt(ObjCAtFinallyStmt * S)6742*67e74705SXin Li TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6743*67e74705SXin Li   // Transform the body.
6744*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6745*67e74705SXin Li   if (Body.isInvalid())
6746*67e74705SXin Li     return StmtError();
6747*67e74705SXin Li 
6748*67e74705SXin Li   // If nothing changed, just retain this statement.
6749*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6750*67e74705SXin Li       Body.get() == S->getFinallyBody())
6751*67e74705SXin Li     return S;
6752*67e74705SXin Li 
6753*67e74705SXin Li   // Build a new statement.
6754*67e74705SXin Li   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6755*67e74705SXin Li                                                Body.get());
6756*67e74705SXin Li }
6757*67e74705SXin Li 
6758*67e74705SXin Li template<typename Derived>
6759*67e74705SXin Li StmtResult
TransformObjCAtThrowStmt(ObjCAtThrowStmt * S)6760*67e74705SXin Li TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6761*67e74705SXin Li   ExprResult Operand;
6762*67e74705SXin Li   if (S->getThrowExpr()) {
6763*67e74705SXin Li     Operand = getDerived().TransformExpr(S->getThrowExpr());
6764*67e74705SXin Li     if (Operand.isInvalid())
6765*67e74705SXin Li       return StmtError();
6766*67e74705SXin Li   }
6767*67e74705SXin Li 
6768*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6769*67e74705SXin Li       Operand.get() == S->getThrowExpr())
6770*67e74705SXin Li     return S;
6771*67e74705SXin Li 
6772*67e74705SXin Li   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6773*67e74705SXin Li }
6774*67e74705SXin Li 
6775*67e74705SXin Li template<typename Derived>
6776*67e74705SXin Li StmtResult
TransformObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)6777*67e74705SXin Li TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6778*67e74705SXin Li                                                   ObjCAtSynchronizedStmt *S) {
6779*67e74705SXin Li   // Transform the object we are locking.
6780*67e74705SXin Li   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6781*67e74705SXin Li   if (Object.isInvalid())
6782*67e74705SXin Li     return StmtError();
6783*67e74705SXin Li   Object =
6784*67e74705SXin Li     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6785*67e74705SXin Li                                                   Object.get());
6786*67e74705SXin Li   if (Object.isInvalid())
6787*67e74705SXin Li     return StmtError();
6788*67e74705SXin Li 
6789*67e74705SXin Li   // Transform the body.
6790*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6791*67e74705SXin Li   if (Body.isInvalid())
6792*67e74705SXin Li     return StmtError();
6793*67e74705SXin Li 
6794*67e74705SXin Li   // If nothing change, just retain the current statement.
6795*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6796*67e74705SXin Li       Object.get() == S->getSynchExpr() &&
6797*67e74705SXin Li       Body.get() == S->getSynchBody())
6798*67e74705SXin Li     return S;
6799*67e74705SXin Li 
6800*67e74705SXin Li   // Build a new statement.
6801*67e74705SXin Li   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6802*67e74705SXin Li                                                     Object.get(), Body.get());
6803*67e74705SXin Li }
6804*67e74705SXin Li 
6805*67e74705SXin Li template<typename Derived>
6806*67e74705SXin Li StmtResult
TransformObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)6807*67e74705SXin Li TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6808*67e74705SXin Li                                               ObjCAutoreleasePoolStmt *S) {
6809*67e74705SXin Li   // Transform the body.
6810*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6811*67e74705SXin Li   if (Body.isInvalid())
6812*67e74705SXin Li     return StmtError();
6813*67e74705SXin Li 
6814*67e74705SXin Li   // If nothing changed, just retain this statement.
6815*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6816*67e74705SXin Li       Body.get() == S->getSubStmt())
6817*67e74705SXin Li     return S;
6818*67e74705SXin Li 
6819*67e74705SXin Li   // Build a new statement.
6820*67e74705SXin Li   return getDerived().RebuildObjCAutoreleasePoolStmt(
6821*67e74705SXin Li                         S->getAtLoc(), Body.get());
6822*67e74705SXin Li }
6823*67e74705SXin Li 
6824*67e74705SXin Li template<typename Derived>
6825*67e74705SXin Li StmtResult
TransformObjCForCollectionStmt(ObjCForCollectionStmt * S)6826*67e74705SXin Li TreeTransform<Derived>::TransformObjCForCollectionStmt(
6827*67e74705SXin Li                                                   ObjCForCollectionStmt *S) {
6828*67e74705SXin Li   // Transform the element statement.
6829*67e74705SXin Li   StmtResult Element = getDerived().TransformStmt(S->getElement());
6830*67e74705SXin Li   if (Element.isInvalid())
6831*67e74705SXin Li     return StmtError();
6832*67e74705SXin Li 
6833*67e74705SXin Li   // Transform the collection expression.
6834*67e74705SXin Li   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6835*67e74705SXin Li   if (Collection.isInvalid())
6836*67e74705SXin Li     return StmtError();
6837*67e74705SXin Li 
6838*67e74705SXin Li   // Transform the body.
6839*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getBody());
6840*67e74705SXin Li   if (Body.isInvalid())
6841*67e74705SXin Li     return StmtError();
6842*67e74705SXin Li 
6843*67e74705SXin Li   // If nothing changed, just retain this statement.
6844*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
6845*67e74705SXin Li       Element.get() == S->getElement() &&
6846*67e74705SXin Li       Collection.get() == S->getCollection() &&
6847*67e74705SXin Li       Body.get() == S->getBody())
6848*67e74705SXin Li     return S;
6849*67e74705SXin Li 
6850*67e74705SXin Li   // Build a new statement.
6851*67e74705SXin Li   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6852*67e74705SXin Li                                                    Element.get(),
6853*67e74705SXin Li                                                    Collection.get(),
6854*67e74705SXin Li                                                    S->getRParenLoc(),
6855*67e74705SXin Li                                                    Body.get());
6856*67e74705SXin Li }
6857*67e74705SXin Li 
6858*67e74705SXin Li template <typename Derived>
TransformCXXCatchStmt(CXXCatchStmt * S)6859*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6860*67e74705SXin Li   // Transform the exception declaration, if any.
6861*67e74705SXin Li   VarDecl *Var = nullptr;
6862*67e74705SXin Li   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6863*67e74705SXin Li     TypeSourceInfo *T =
6864*67e74705SXin Li         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6865*67e74705SXin Li     if (!T)
6866*67e74705SXin Li       return StmtError();
6867*67e74705SXin Li 
6868*67e74705SXin Li     Var = getDerived().RebuildExceptionDecl(
6869*67e74705SXin Li         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6870*67e74705SXin Li         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6871*67e74705SXin Li     if (!Var || Var->isInvalidDecl())
6872*67e74705SXin Li       return StmtError();
6873*67e74705SXin Li   }
6874*67e74705SXin Li 
6875*67e74705SXin Li   // Transform the actual exception handler.
6876*67e74705SXin Li   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6877*67e74705SXin Li   if (Handler.isInvalid())
6878*67e74705SXin Li     return StmtError();
6879*67e74705SXin Li 
6880*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !Var &&
6881*67e74705SXin Li       Handler.get() == S->getHandlerBlock())
6882*67e74705SXin Li     return S;
6883*67e74705SXin Li 
6884*67e74705SXin Li   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6885*67e74705SXin Li }
6886*67e74705SXin Li 
6887*67e74705SXin Li template <typename Derived>
TransformCXXTryStmt(CXXTryStmt * S)6888*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6889*67e74705SXin Li   // Transform the try block itself.
6890*67e74705SXin Li   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6891*67e74705SXin Li   if (TryBlock.isInvalid())
6892*67e74705SXin Li     return StmtError();
6893*67e74705SXin Li 
6894*67e74705SXin Li   // Transform the handlers.
6895*67e74705SXin Li   bool HandlerChanged = false;
6896*67e74705SXin Li   SmallVector<Stmt *, 8> Handlers;
6897*67e74705SXin Li   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6898*67e74705SXin Li     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6899*67e74705SXin Li     if (Handler.isInvalid())
6900*67e74705SXin Li       return StmtError();
6901*67e74705SXin Li 
6902*67e74705SXin Li     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6903*67e74705SXin Li     Handlers.push_back(Handler.getAs<Stmt>());
6904*67e74705SXin Li   }
6905*67e74705SXin Li 
6906*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6907*67e74705SXin Li       !HandlerChanged)
6908*67e74705SXin Li     return S;
6909*67e74705SXin Li 
6910*67e74705SXin Li   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6911*67e74705SXin Li                                         Handlers);
6912*67e74705SXin Li }
6913*67e74705SXin Li 
6914*67e74705SXin Li template<typename Derived>
6915*67e74705SXin Li StmtResult
TransformCXXForRangeStmt(CXXForRangeStmt * S)6916*67e74705SXin Li TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6917*67e74705SXin Li   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6918*67e74705SXin Li   if (Range.isInvalid())
6919*67e74705SXin Li     return StmtError();
6920*67e74705SXin Li 
6921*67e74705SXin Li   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
6922*67e74705SXin Li   if (Begin.isInvalid())
6923*67e74705SXin Li     return StmtError();
6924*67e74705SXin Li   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
6925*67e74705SXin Li   if (End.isInvalid())
6926*67e74705SXin Li     return StmtError();
6927*67e74705SXin Li 
6928*67e74705SXin Li   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6929*67e74705SXin Li   if (Cond.isInvalid())
6930*67e74705SXin Li     return StmtError();
6931*67e74705SXin Li   if (Cond.get())
6932*67e74705SXin Li     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
6933*67e74705SXin Li   if (Cond.isInvalid())
6934*67e74705SXin Li     return StmtError();
6935*67e74705SXin Li   if (Cond.get())
6936*67e74705SXin Li     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6937*67e74705SXin Li 
6938*67e74705SXin Li   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6939*67e74705SXin Li   if (Inc.isInvalid())
6940*67e74705SXin Li     return StmtError();
6941*67e74705SXin Li   if (Inc.get())
6942*67e74705SXin Li     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6943*67e74705SXin Li 
6944*67e74705SXin Li   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6945*67e74705SXin Li   if (LoopVar.isInvalid())
6946*67e74705SXin Li     return StmtError();
6947*67e74705SXin Li 
6948*67e74705SXin Li   StmtResult NewStmt = S;
6949*67e74705SXin Li   if (getDerived().AlwaysRebuild() ||
6950*67e74705SXin Li       Range.get() != S->getRangeStmt() ||
6951*67e74705SXin Li       Begin.get() != S->getBeginStmt() ||
6952*67e74705SXin Li       End.get() != S->getEndStmt() ||
6953*67e74705SXin Li       Cond.get() != S->getCond() ||
6954*67e74705SXin Li       Inc.get() != S->getInc() ||
6955*67e74705SXin Li       LoopVar.get() != S->getLoopVarStmt()) {
6956*67e74705SXin Li     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6957*67e74705SXin Li                                                   S->getCoawaitLoc(),
6958*67e74705SXin Li                                                   S->getColonLoc(), Range.get(),
6959*67e74705SXin Li                                                   Begin.get(), End.get(),
6960*67e74705SXin Li                                                   Cond.get(),
6961*67e74705SXin Li                                                   Inc.get(), LoopVar.get(),
6962*67e74705SXin Li                                                   S->getRParenLoc());
6963*67e74705SXin Li     if (NewStmt.isInvalid())
6964*67e74705SXin Li       return StmtError();
6965*67e74705SXin Li   }
6966*67e74705SXin Li 
6967*67e74705SXin Li   StmtResult Body = getDerived().TransformStmt(S->getBody());
6968*67e74705SXin Li   if (Body.isInvalid())
6969*67e74705SXin Li     return StmtError();
6970*67e74705SXin Li 
6971*67e74705SXin Li   // Body has changed but we didn't rebuild the for-range statement. Rebuild
6972*67e74705SXin Li   // it now so we have a new statement to attach the body to.
6973*67e74705SXin Li   if (Body.get() != S->getBody() && NewStmt.get() == S) {
6974*67e74705SXin Li     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6975*67e74705SXin Li                                                   S->getCoawaitLoc(),
6976*67e74705SXin Li                                                   S->getColonLoc(), Range.get(),
6977*67e74705SXin Li                                                   Begin.get(), End.get(),
6978*67e74705SXin Li                                                   Cond.get(),
6979*67e74705SXin Li                                                   Inc.get(), LoopVar.get(),
6980*67e74705SXin Li                                                   S->getRParenLoc());
6981*67e74705SXin Li     if (NewStmt.isInvalid())
6982*67e74705SXin Li       return StmtError();
6983*67e74705SXin Li   }
6984*67e74705SXin Li 
6985*67e74705SXin Li   if (NewStmt.get() == S)
6986*67e74705SXin Li     return S;
6987*67e74705SXin Li 
6988*67e74705SXin Li   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
6989*67e74705SXin Li }
6990*67e74705SXin Li 
6991*67e74705SXin Li template<typename Derived>
6992*67e74705SXin Li StmtResult
TransformMSDependentExistsStmt(MSDependentExistsStmt * S)6993*67e74705SXin Li TreeTransform<Derived>::TransformMSDependentExistsStmt(
6994*67e74705SXin Li                                                     MSDependentExistsStmt *S) {
6995*67e74705SXin Li   // Transform the nested-name-specifier, if any.
6996*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
6997*67e74705SXin Li   if (S->getQualifierLoc()) {
6998*67e74705SXin Li     QualifierLoc
6999*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7000*67e74705SXin Li     if (!QualifierLoc)
7001*67e74705SXin Li       return StmtError();
7002*67e74705SXin Li   }
7003*67e74705SXin Li 
7004*67e74705SXin Li   // Transform the declaration name.
7005*67e74705SXin Li   DeclarationNameInfo NameInfo = S->getNameInfo();
7006*67e74705SXin Li   if (NameInfo.getName()) {
7007*67e74705SXin Li     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7008*67e74705SXin Li     if (!NameInfo.getName())
7009*67e74705SXin Li       return StmtError();
7010*67e74705SXin Li   }
7011*67e74705SXin Li 
7012*67e74705SXin Li   // Check whether anything changed.
7013*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
7014*67e74705SXin Li       QualifierLoc == S->getQualifierLoc() &&
7015*67e74705SXin Li       NameInfo.getName() == S->getNameInfo().getName())
7016*67e74705SXin Li     return S;
7017*67e74705SXin Li 
7018*67e74705SXin Li   // Determine whether this name exists, if we can.
7019*67e74705SXin Li   CXXScopeSpec SS;
7020*67e74705SXin Li   SS.Adopt(QualifierLoc);
7021*67e74705SXin Li   bool Dependent = false;
7022*67e74705SXin Li   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7023*67e74705SXin Li   case Sema::IER_Exists:
7024*67e74705SXin Li     if (S->isIfExists())
7025*67e74705SXin Li       break;
7026*67e74705SXin Li 
7027*67e74705SXin Li     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7028*67e74705SXin Li 
7029*67e74705SXin Li   case Sema::IER_DoesNotExist:
7030*67e74705SXin Li     if (S->isIfNotExists())
7031*67e74705SXin Li       break;
7032*67e74705SXin Li 
7033*67e74705SXin Li     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7034*67e74705SXin Li 
7035*67e74705SXin Li   case Sema::IER_Dependent:
7036*67e74705SXin Li     Dependent = true;
7037*67e74705SXin Li     break;
7038*67e74705SXin Li 
7039*67e74705SXin Li   case Sema::IER_Error:
7040*67e74705SXin Li     return StmtError();
7041*67e74705SXin Li   }
7042*67e74705SXin Li 
7043*67e74705SXin Li   // We need to continue with the instantiation, so do so now.
7044*67e74705SXin Li   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7045*67e74705SXin Li   if (SubStmt.isInvalid())
7046*67e74705SXin Li     return StmtError();
7047*67e74705SXin Li 
7048*67e74705SXin Li   // If we have resolved the name, just transform to the substatement.
7049*67e74705SXin Li   if (!Dependent)
7050*67e74705SXin Li     return SubStmt;
7051*67e74705SXin Li 
7052*67e74705SXin Li   // The name is still dependent, so build a dependent expression again.
7053*67e74705SXin Li   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7054*67e74705SXin Li                                                    S->isIfExists(),
7055*67e74705SXin Li                                                    QualifierLoc,
7056*67e74705SXin Li                                                    NameInfo,
7057*67e74705SXin Li                                                    SubStmt.get());
7058*67e74705SXin Li }
7059*67e74705SXin Li 
7060*67e74705SXin Li template<typename Derived>
7061*67e74705SXin Li ExprResult
TransformMSPropertyRefExpr(MSPropertyRefExpr * E)7062*67e74705SXin Li TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7063*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
7064*67e74705SXin Li   if (E->getQualifierLoc()) {
7065*67e74705SXin Li     QualifierLoc
7066*67e74705SXin Li     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7067*67e74705SXin Li     if (!QualifierLoc)
7068*67e74705SXin Li       return ExprError();
7069*67e74705SXin Li   }
7070*67e74705SXin Li 
7071*67e74705SXin Li   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7072*67e74705SXin Li     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7073*67e74705SXin Li   if (!PD)
7074*67e74705SXin Li     return ExprError();
7075*67e74705SXin Li 
7076*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7077*67e74705SXin Li   if (Base.isInvalid())
7078*67e74705SXin Li     return ExprError();
7079*67e74705SXin Li 
7080*67e74705SXin Li   return new (SemaRef.getASTContext())
7081*67e74705SXin Li       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7082*67e74705SXin Li                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7083*67e74705SXin Li                         QualifierLoc, E->getMemberLoc());
7084*67e74705SXin Li }
7085*67e74705SXin Li 
7086*67e74705SXin Li template <typename Derived>
TransformMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)7087*67e74705SXin Li ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7088*67e74705SXin Li     MSPropertySubscriptExpr *E) {
7089*67e74705SXin Li   auto BaseRes = getDerived().TransformExpr(E->getBase());
7090*67e74705SXin Li   if (BaseRes.isInvalid())
7091*67e74705SXin Li     return ExprError();
7092*67e74705SXin Li   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7093*67e74705SXin Li   if (IdxRes.isInvalid())
7094*67e74705SXin Li     return ExprError();
7095*67e74705SXin Li 
7096*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
7097*67e74705SXin Li       BaseRes.get() == E->getBase() &&
7098*67e74705SXin Li       IdxRes.get() == E->getIdx())
7099*67e74705SXin Li     return E;
7100*67e74705SXin Li 
7101*67e74705SXin Li   return getDerived().RebuildArraySubscriptExpr(
7102*67e74705SXin Li       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7103*67e74705SXin Li }
7104*67e74705SXin Li 
7105*67e74705SXin Li template <typename Derived>
TransformSEHTryStmt(SEHTryStmt * S)7106*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7107*67e74705SXin Li   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7108*67e74705SXin Li   if (TryBlock.isInvalid())
7109*67e74705SXin Li     return StmtError();
7110*67e74705SXin Li 
7111*67e74705SXin Li   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7112*67e74705SXin Li   if (Handler.isInvalid())
7113*67e74705SXin Li     return StmtError();
7114*67e74705SXin Li 
7115*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7116*67e74705SXin Li       Handler.get() == S->getHandler())
7117*67e74705SXin Li     return S;
7118*67e74705SXin Li 
7119*67e74705SXin Li   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7120*67e74705SXin Li                                         TryBlock.get(), Handler.get());
7121*67e74705SXin Li }
7122*67e74705SXin Li 
7123*67e74705SXin Li template <typename Derived>
TransformSEHFinallyStmt(SEHFinallyStmt * S)7124*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7125*67e74705SXin Li   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7126*67e74705SXin Li   if (Block.isInvalid())
7127*67e74705SXin Li     return StmtError();
7128*67e74705SXin Li 
7129*67e74705SXin Li   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7130*67e74705SXin Li }
7131*67e74705SXin Li 
7132*67e74705SXin Li template <typename Derived>
TransformSEHExceptStmt(SEHExceptStmt * S)7133*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7134*67e74705SXin Li   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7135*67e74705SXin Li   if (FilterExpr.isInvalid())
7136*67e74705SXin Li     return StmtError();
7137*67e74705SXin Li 
7138*67e74705SXin Li   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7139*67e74705SXin Li   if (Block.isInvalid())
7140*67e74705SXin Li     return StmtError();
7141*67e74705SXin Li 
7142*67e74705SXin Li   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7143*67e74705SXin Li                                            Block.get());
7144*67e74705SXin Li }
7145*67e74705SXin Li 
7146*67e74705SXin Li template <typename Derived>
TransformSEHHandler(Stmt * Handler)7147*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7148*67e74705SXin Li   if (isa<SEHFinallyStmt>(Handler))
7149*67e74705SXin Li     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7150*67e74705SXin Li   else
7151*67e74705SXin Li     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7152*67e74705SXin Li }
7153*67e74705SXin Li 
7154*67e74705SXin Li template<typename Derived>
7155*67e74705SXin Li StmtResult
TransformSEHLeaveStmt(SEHLeaveStmt * S)7156*67e74705SXin Li TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7157*67e74705SXin Li   return S;
7158*67e74705SXin Li }
7159*67e74705SXin Li 
7160*67e74705SXin Li //===----------------------------------------------------------------------===//
7161*67e74705SXin Li // OpenMP directive transformation
7162*67e74705SXin Li //===----------------------------------------------------------------------===//
7163*67e74705SXin Li template <typename Derived>
TransformOMPExecutableDirective(OMPExecutableDirective * D)7164*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7165*67e74705SXin Li     OMPExecutableDirective *D) {
7166*67e74705SXin Li 
7167*67e74705SXin Li   // Transform the clauses
7168*67e74705SXin Li   llvm::SmallVector<OMPClause *, 16> TClauses;
7169*67e74705SXin Li   ArrayRef<OMPClause *> Clauses = D->clauses();
7170*67e74705SXin Li   TClauses.reserve(Clauses.size());
7171*67e74705SXin Li   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7172*67e74705SXin Li        I != E; ++I) {
7173*67e74705SXin Li     if (*I) {
7174*67e74705SXin Li       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7175*67e74705SXin Li       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7176*67e74705SXin Li       getDerived().getSema().EndOpenMPClause();
7177*67e74705SXin Li       if (Clause)
7178*67e74705SXin Li         TClauses.push_back(Clause);
7179*67e74705SXin Li     } else {
7180*67e74705SXin Li       TClauses.push_back(nullptr);
7181*67e74705SXin Li     }
7182*67e74705SXin Li   }
7183*67e74705SXin Li   StmtResult AssociatedStmt;
7184*67e74705SXin Li   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7185*67e74705SXin Li     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7186*67e74705SXin Li                                                   /*CurScope=*/nullptr);
7187*67e74705SXin Li     StmtResult Body;
7188*67e74705SXin Li     {
7189*67e74705SXin Li       Sema::CompoundScopeRAII CompoundScope(getSema());
7190*67e74705SXin Li       Body = getDerived().TransformStmt(
7191*67e74705SXin Li           cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt());
7192*67e74705SXin Li     }
7193*67e74705SXin Li     AssociatedStmt =
7194*67e74705SXin Li         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7195*67e74705SXin Li     if (AssociatedStmt.isInvalid()) {
7196*67e74705SXin Li       return StmtError();
7197*67e74705SXin Li     }
7198*67e74705SXin Li   }
7199*67e74705SXin Li   if (TClauses.size() != Clauses.size()) {
7200*67e74705SXin Li     return StmtError();
7201*67e74705SXin Li   }
7202*67e74705SXin Li 
7203*67e74705SXin Li   // Transform directive name for 'omp critical' directive.
7204*67e74705SXin Li   DeclarationNameInfo DirName;
7205*67e74705SXin Li   if (D->getDirectiveKind() == OMPD_critical) {
7206*67e74705SXin Li     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7207*67e74705SXin Li     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7208*67e74705SXin Li   }
7209*67e74705SXin Li   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7210*67e74705SXin Li   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7211*67e74705SXin Li     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7212*67e74705SXin Li   } else if (D->getDirectiveKind() == OMPD_cancel) {
7213*67e74705SXin Li     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7214*67e74705SXin Li   }
7215*67e74705SXin Li 
7216*67e74705SXin Li   return getDerived().RebuildOMPExecutableDirective(
7217*67e74705SXin Li       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7218*67e74705SXin Li       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7219*67e74705SXin Li }
7220*67e74705SXin Li 
7221*67e74705SXin Li template <typename Derived>
7222*67e74705SXin Li StmtResult
TransformOMPParallelDirective(OMPParallelDirective * D)7223*67e74705SXin Li TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7224*67e74705SXin Li   DeclarationNameInfo DirName;
7225*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7226*67e74705SXin Li                                              D->getLocStart());
7227*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7228*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7229*67e74705SXin Li   return Res;
7230*67e74705SXin Li }
7231*67e74705SXin Li 
7232*67e74705SXin Li template <typename Derived>
7233*67e74705SXin Li StmtResult
TransformOMPSimdDirective(OMPSimdDirective * D)7234*67e74705SXin Li TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7235*67e74705SXin Li   DeclarationNameInfo DirName;
7236*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7237*67e74705SXin Li                                              D->getLocStart());
7238*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7239*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7240*67e74705SXin Li   return Res;
7241*67e74705SXin Li }
7242*67e74705SXin Li 
7243*67e74705SXin Li template <typename Derived>
7244*67e74705SXin Li StmtResult
TransformOMPForDirective(OMPForDirective * D)7245*67e74705SXin Li TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7246*67e74705SXin Li   DeclarationNameInfo DirName;
7247*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7248*67e74705SXin Li                                              D->getLocStart());
7249*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7250*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7251*67e74705SXin Li   return Res;
7252*67e74705SXin Li }
7253*67e74705SXin Li 
7254*67e74705SXin Li template <typename Derived>
7255*67e74705SXin Li StmtResult
TransformOMPForSimdDirective(OMPForSimdDirective * D)7256*67e74705SXin Li TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7257*67e74705SXin Li   DeclarationNameInfo DirName;
7258*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7259*67e74705SXin Li                                              D->getLocStart());
7260*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7261*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7262*67e74705SXin Li   return Res;
7263*67e74705SXin Li }
7264*67e74705SXin Li 
7265*67e74705SXin Li template <typename Derived>
7266*67e74705SXin Li StmtResult
TransformOMPSectionsDirective(OMPSectionsDirective * D)7267*67e74705SXin Li TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7268*67e74705SXin Li   DeclarationNameInfo DirName;
7269*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7270*67e74705SXin Li                                              D->getLocStart());
7271*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7272*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7273*67e74705SXin Li   return Res;
7274*67e74705SXin Li }
7275*67e74705SXin Li 
7276*67e74705SXin Li template <typename Derived>
7277*67e74705SXin Li StmtResult
TransformOMPSectionDirective(OMPSectionDirective * D)7278*67e74705SXin Li TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7279*67e74705SXin Li   DeclarationNameInfo DirName;
7280*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7281*67e74705SXin Li                                              D->getLocStart());
7282*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7283*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7284*67e74705SXin Li   return Res;
7285*67e74705SXin Li }
7286*67e74705SXin Li 
7287*67e74705SXin Li template <typename Derived>
7288*67e74705SXin Li StmtResult
TransformOMPSingleDirective(OMPSingleDirective * D)7289*67e74705SXin Li TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7290*67e74705SXin Li   DeclarationNameInfo DirName;
7291*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7292*67e74705SXin Li                                              D->getLocStart());
7293*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7294*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7295*67e74705SXin Li   return Res;
7296*67e74705SXin Li }
7297*67e74705SXin Li 
7298*67e74705SXin Li template <typename Derived>
7299*67e74705SXin Li StmtResult
TransformOMPMasterDirective(OMPMasterDirective * D)7300*67e74705SXin Li TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7301*67e74705SXin Li   DeclarationNameInfo DirName;
7302*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7303*67e74705SXin Li                                              D->getLocStart());
7304*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7305*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7306*67e74705SXin Li   return Res;
7307*67e74705SXin Li }
7308*67e74705SXin Li 
7309*67e74705SXin Li template <typename Derived>
7310*67e74705SXin Li StmtResult
TransformOMPCriticalDirective(OMPCriticalDirective * D)7311*67e74705SXin Li TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7312*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(
7313*67e74705SXin Li       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7314*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7315*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7316*67e74705SXin Li   return Res;
7317*67e74705SXin Li }
7318*67e74705SXin Li 
7319*67e74705SXin Li template <typename Derived>
TransformOMPParallelForDirective(OMPParallelForDirective * D)7320*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7321*67e74705SXin Li     OMPParallelForDirective *D) {
7322*67e74705SXin Li   DeclarationNameInfo DirName;
7323*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7324*67e74705SXin Li                                              nullptr, D->getLocStart());
7325*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7326*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7327*67e74705SXin Li   return Res;
7328*67e74705SXin Li }
7329*67e74705SXin Li 
7330*67e74705SXin Li template <typename Derived>
TransformOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)7331*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7332*67e74705SXin Li     OMPParallelForSimdDirective *D) {
7333*67e74705SXin Li   DeclarationNameInfo DirName;
7334*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7335*67e74705SXin Li                                              nullptr, D->getLocStart());
7336*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7337*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7338*67e74705SXin Li   return Res;
7339*67e74705SXin Li }
7340*67e74705SXin Li 
7341*67e74705SXin Li template <typename Derived>
TransformOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)7342*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7343*67e74705SXin Li     OMPParallelSectionsDirective *D) {
7344*67e74705SXin Li   DeclarationNameInfo DirName;
7345*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7346*67e74705SXin Li                                              nullptr, D->getLocStart());
7347*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7348*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7349*67e74705SXin Li   return Res;
7350*67e74705SXin Li }
7351*67e74705SXin Li 
7352*67e74705SXin Li template <typename Derived>
7353*67e74705SXin Li StmtResult
TransformOMPTaskDirective(OMPTaskDirective * D)7354*67e74705SXin Li TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7355*67e74705SXin Li   DeclarationNameInfo DirName;
7356*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7357*67e74705SXin Li                                              D->getLocStart());
7358*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7359*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7360*67e74705SXin Li   return Res;
7361*67e74705SXin Li }
7362*67e74705SXin Li 
7363*67e74705SXin Li template <typename Derived>
TransformOMPTaskyieldDirective(OMPTaskyieldDirective * D)7364*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7365*67e74705SXin Li     OMPTaskyieldDirective *D) {
7366*67e74705SXin Li   DeclarationNameInfo DirName;
7367*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7368*67e74705SXin Li                                              D->getLocStart());
7369*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7370*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7371*67e74705SXin Li   return Res;
7372*67e74705SXin Li }
7373*67e74705SXin Li 
7374*67e74705SXin Li template <typename Derived>
7375*67e74705SXin Li StmtResult
TransformOMPBarrierDirective(OMPBarrierDirective * D)7376*67e74705SXin Li TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7377*67e74705SXin Li   DeclarationNameInfo DirName;
7378*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7379*67e74705SXin Li                                              D->getLocStart());
7380*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7381*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7382*67e74705SXin Li   return Res;
7383*67e74705SXin Li }
7384*67e74705SXin Li 
7385*67e74705SXin Li template <typename Derived>
7386*67e74705SXin Li StmtResult
TransformOMPTaskwaitDirective(OMPTaskwaitDirective * D)7387*67e74705SXin Li TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7388*67e74705SXin Li   DeclarationNameInfo DirName;
7389*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7390*67e74705SXin Li                                              D->getLocStart());
7391*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7392*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7393*67e74705SXin Li   return Res;
7394*67e74705SXin Li }
7395*67e74705SXin Li 
7396*67e74705SXin Li template <typename Derived>
TransformOMPTaskgroupDirective(OMPTaskgroupDirective * D)7397*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7398*67e74705SXin Li     OMPTaskgroupDirective *D) {
7399*67e74705SXin Li   DeclarationNameInfo DirName;
7400*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7401*67e74705SXin Li                                              D->getLocStart());
7402*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7403*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7404*67e74705SXin Li   return Res;
7405*67e74705SXin Li }
7406*67e74705SXin Li 
7407*67e74705SXin Li template <typename Derived>
7408*67e74705SXin Li StmtResult
TransformOMPFlushDirective(OMPFlushDirective * D)7409*67e74705SXin Li TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7410*67e74705SXin Li   DeclarationNameInfo DirName;
7411*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7412*67e74705SXin Li                                              D->getLocStart());
7413*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7414*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7415*67e74705SXin Li   return Res;
7416*67e74705SXin Li }
7417*67e74705SXin Li 
7418*67e74705SXin Li template <typename Derived>
7419*67e74705SXin Li StmtResult
TransformOMPOrderedDirective(OMPOrderedDirective * D)7420*67e74705SXin Li TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7421*67e74705SXin Li   DeclarationNameInfo DirName;
7422*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7423*67e74705SXin Li                                              D->getLocStart());
7424*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7425*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7426*67e74705SXin Li   return Res;
7427*67e74705SXin Li }
7428*67e74705SXin Li 
7429*67e74705SXin Li template <typename Derived>
7430*67e74705SXin Li StmtResult
TransformOMPAtomicDirective(OMPAtomicDirective * D)7431*67e74705SXin Li TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7432*67e74705SXin Li   DeclarationNameInfo DirName;
7433*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7434*67e74705SXin Li                                              D->getLocStart());
7435*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7436*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7437*67e74705SXin Li   return Res;
7438*67e74705SXin Li }
7439*67e74705SXin Li 
7440*67e74705SXin Li template <typename Derived>
7441*67e74705SXin Li StmtResult
TransformOMPTargetDirective(OMPTargetDirective * D)7442*67e74705SXin Li TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7443*67e74705SXin Li   DeclarationNameInfo DirName;
7444*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7445*67e74705SXin Li                                              D->getLocStart());
7446*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7447*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7448*67e74705SXin Li   return Res;
7449*67e74705SXin Li }
7450*67e74705SXin Li 
7451*67e74705SXin Li template <typename Derived>
TransformOMPTargetDataDirective(OMPTargetDataDirective * D)7452*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7453*67e74705SXin Li     OMPTargetDataDirective *D) {
7454*67e74705SXin Li   DeclarationNameInfo DirName;
7455*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7456*67e74705SXin Li                                              D->getLocStart());
7457*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7458*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7459*67e74705SXin Li   return Res;
7460*67e74705SXin Li }
7461*67e74705SXin Li 
7462*67e74705SXin Li template <typename Derived>
TransformOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)7463*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7464*67e74705SXin Li     OMPTargetEnterDataDirective *D) {
7465*67e74705SXin Li   DeclarationNameInfo DirName;
7466*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7467*67e74705SXin Li                                              nullptr, D->getLocStart());
7468*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7469*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7470*67e74705SXin Li   return Res;
7471*67e74705SXin Li }
7472*67e74705SXin Li 
7473*67e74705SXin Li template <typename Derived>
TransformOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)7474*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7475*67e74705SXin Li     OMPTargetExitDataDirective *D) {
7476*67e74705SXin Li   DeclarationNameInfo DirName;
7477*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7478*67e74705SXin Li                                              nullptr, D->getLocStart());
7479*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7480*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7481*67e74705SXin Li   return Res;
7482*67e74705SXin Li }
7483*67e74705SXin Li 
7484*67e74705SXin Li template <typename Derived>
TransformOMPTargetParallelDirective(OMPTargetParallelDirective * D)7485*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7486*67e74705SXin Li     OMPTargetParallelDirective *D) {
7487*67e74705SXin Li   DeclarationNameInfo DirName;
7488*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7489*67e74705SXin Li                                              nullptr, D->getLocStart());
7490*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7491*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7492*67e74705SXin Li   return Res;
7493*67e74705SXin Li }
7494*67e74705SXin Li 
7495*67e74705SXin Li template <typename Derived>
TransformOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)7496*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7497*67e74705SXin Li     OMPTargetParallelForDirective *D) {
7498*67e74705SXin Li   DeclarationNameInfo DirName;
7499*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7500*67e74705SXin Li                                              nullptr, D->getLocStart());
7501*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7502*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7503*67e74705SXin Li   return Res;
7504*67e74705SXin Li }
7505*67e74705SXin Li 
7506*67e74705SXin Li template <typename Derived>
TransformOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)7507*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7508*67e74705SXin Li     OMPTargetUpdateDirective *D) {
7509*67e74705SXin Li   DeclarationNameInfo DirName;
7510*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7511*67e74705SXin Li                                              nullptr, D->getLocStart());
7512*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7513*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7514*67e74705SXin Li   return Res;
7515*67e74705SXin Li }
7516*67e74705SXin Li 
7517*67e74705SXin Li template <typename Derived>
7518*67e74705SXin Li StmtResult
TransformOMPTeamsDirective(OMPTeamsDirective * D)7519*67e74705SXin Li TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7520*67e74705SXin Li   DeclarationNameInfo DirName;
7521*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7522*67e74705SXin Li                                              D->getLocStart());
7523*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7524*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7525*67e74705SXin Li   return Res;
7526*67e74705SXin Li }
7527*67e74705SXin Li 
7528*67e74705SXin Li template <typename Derived>
TransformOMPCancellationPointDirective(OMPCancellationPointDirective * D)7529*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7530*67e74705SXin Li     OMPCancellationPointDirective *D) {
7531*67e74705SXin Li   DeclarationNameInfo DirName;
7532*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7533*67e74705SXin Li                                              nullptr, D->getLocStart());
7534*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7535*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7536*67e74705SXin Li   return Res;
7537*67e74705SXin Li }
7538*67e74705SXin Li 
7539*67e74705SXin Li template <typename Derived>
7540*67e74705SXin Li StmtResult
TransformOMPCancelDirective(OMPCancelDirective * D)7541*67e74705SXin Li TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7542*67e74705SXin Li   DeclarationNameInfo DirName;
7543*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7544*67e74705SXin Li                                              D->getLocStart());
7545*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7546*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7547*67e74705SXin Li   return Res;
7548*67e74705SXin Li }
7549*67e74705SXin Li 
7550*67e74705SXin Li template <typename Derived>
7551*67e74705SXin Li StmtResult
TransformOMPTaskLoopDirective(OMPTaskLoopDirective * D)7552*67e74705SXin Li TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7553*67e74705SXin Li   DeclarationNameInfo DirName;
7554*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7555*67e74705SXin Li                                              D->getLocStart());
7556*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7557*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7558*67e74705SXin Li   return Res;
7559*67e74705SXin Li }
7560*67e74705SXin Li 
7561*67e74705SXin Li template <typename Derived>
TransformOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)7562*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
7563*67e74705SXin Li     OMPTaskLoopSimdDirective *D) {
7564*67e74705SXin Li   DeclarationNameInfo DirName;
7565*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
7566*67e74705SXin Li                                              nullptr, D->getLocStart());
7567*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7568*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7569*67e74705SXin Li   return Res;
7570*67e74705SXin Li }
7571*67e74705SXin Li 
7572*67e74705SXin Li template <typename Derived>
TransformOMPDistributeDirective(OMPDistributeDirective * D)7573*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
7574*67e74705SXin Li     OMPDistributeDirective *D) {
7575*67e74705SXin Li   DeclarationNameInfo DirName;
7576*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
7577*67e74705SXin Li                                              D->getLocStart());
7578*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7579*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7580*67e74705SXin Li   return Res;
7581*67e74705SXin Li }
7582*67e74705SXin Li 
7583*67e74705SXin Li template <typename Derived>
TransformOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)7584*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
7585*67e74705SXin Li     OMPDistributeParallelForDirective *D) {
7586*67e74705SXin Li   DeclarationNameInfo DirName;
7587*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(
7588*67e74705SXin Li       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
7589*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7590*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7591*67e74705SXin Li   return Res;
7592*67e74705SXin Li }
7593*67e74705SXin Li 
7594*67e74705SXin Li template <typename Derived>
7595*67e74705SXin Li StmtResult
TransformOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)7596*67e74705SXin Li TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
7597*67e74705SXin Li     OMPDistributeParallelForSimdDirective *D) {
7598*67e74705SXin Li   DeclarationNameInfo DirName;
7599*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(
7600*67e74705SXin Li       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
7601*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7602*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7603*67e74705SXin Li   return Res;
7604*67e74705SXin Li }
7605*67e74705SXin Li 
7606*67e74705SXin Li template <typename Derived>
TransformOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)7607*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
7608*67e74705SXin Li     OMPDistributeSimdDirective *D) {
7609*67e74705SXin Li   DeclarationNameInfo DirName;
7610*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
7611*67e74705SXin Li                                              nullptr, D->getLocStart());
7612*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7613*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7614*67e74705SXin Li   return Res;
7615*67e74705SXin Li }
7616*67e74705SXin Li 
7617*67e74705SXin Li template <typename Derived>
TransformOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)7618*67e74705SXin Li StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
7619*67e74705SXin Li     OMPTargetParallelForSimdDirective *D) {
7620*67e74705SXin Li   DeclarationNameInfo DirName;
7621*67e74705SXin Li   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
7622*67e74705SXin Li                                              DirName, nullptr,
7623*67e74705SXin Li                                              D->getLocStart());
7624*67e74705SXin Li   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7625*67e74705SXin Li   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7626*67e74705SXin Li   return Res;
7627*67e74705SXin Li }
7628*67e74705SXin Li 
7629*67e74705SXin Li //===----------------------------------------------------------------------===//
7630*67e74705SXin Li // OpenMP clause transformation
7631*67e74705SXin Li //===----------------------------------------------------------------------===//
7632*67e74705SXin Li template <typename Derived>
TransformOMPIfClause(OMPIfClause * C)7633*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
7634*67e74705SXin Li   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7635*67e74705SXin Li   if (Cond.isInvalid())
7636*67e74705SXin Li     return nullptr;
7637*67e74705SXin Li   return getDerived().RebuildOMPIfClause(
7638*67e74705SXin Li       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
7639*67e74705SXin Li       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
7640*67e74705SXin Li }
7641*67e74705SXin Li 
7642*67e74705SXin Li template <typename Derived>
TransformOMPFinalClause(OMPFinalClause * C)7643*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
7644*67e74705SXin Li   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
7645*67e74705SXin Li   if (Cond.isInvalid())
7646*67e74705SXin Li     return nullptr;
7647*67e74705SXin Li   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
7648*67e74705SXin Li                                             C->getLParenLoc(), C->getLocEnd());
7649*67e74705SXin Li }
7650*67e74705SXin Li 
7651*67e74705SXin Li template <typename Derived>
7652*67e74705SXin Li OMPClause *
TransformOMPNumThreadsClause(OMPNumThreadsClause * C)7653*67e74705SXin Li TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
7654*67e74705SXin Li   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
7655*67e74705SXin Li   if (NumThreads.isInvalid())
7656*67e74705SXin Li     return nullptr;
7657*67e74705SXin Li   return getDerived().RebuildOMPNumThreadsClause(
7658*67e74705SXin Li       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7659*67e74705SXin Li }
7660*67e74705SXin Li 
7661*67e74705SXin Li template <typename Derived>
7662*67e74705SXin Li OMPClause *
TransformOMPSafelenClause(OMPSafelenClause * C)7663*67e74705SXin Li TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
7664*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getSafelen());
7665*67e74705SXin Li   if (E.isInvalid())
7666*67e74705SXin Li     return nullptr;
7667*67e74705SXin Li   return getDerived().RebuildOMPSafelenClause(
7668*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7669*67e74705SXin Li }
7670*67e74705SXin Li 
7671*67e74705SXin Li template <typename Derived>
7672*67e74705SXin Li OMPClause *
TransformOMPSimdlenClause(OMPSimdlenClause * C)7673*67e74705SXin Li TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
7674*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
7675*67e74705SXin Li   if (E.isInvalid())
7676*67e74705SXin Li     return nullptr;
7677*67e74705SXin Li   return getDerived().RebuildOMPSimdlenClause(
7678*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7679*67e74705SXin Li }
7680*67e74705SXin Li 
7681*67e74705SXin Li template <typename Derived>
7682*67e74705SXin Li OMPClause *
TransformOMPCollapseClause(OMPCollapseClause * C)7683*67e74705SXin Li TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
7684*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
7685*67e74705SXin Li   if (E.isInvalid())
7686*67e74705SXin Li     return nullptr;
7687*67e74705SXin Li   return getDerived().RebuildOMPCollapseClause(
7688*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7689*67e74705SXin Li }
7690*67e74705SXin Li 
7691*67e74705SXin Li template <typename Derived>
7692*67e74705SXin Li OMPClause *
TransformOMPDefaultClause(OMPDefaultClause * C)7693*67e74705SXin Li TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
7694*67e74705SXin Li   return getDerived().RebuildOMPDefaultClause(
7695*67e74705SXin Li       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
7696*67e74705SXin Li       C->getLParenLoc(), C->getLocEnd());
7697*67e74705SXin Li }
7698*67e74705SXin Li 
7699*67e74705SXin Li template <typename Derived>
7700*67e74705SXin Li OMPClause *
TransformOMPProcBindClause(OMPProcBindClause * C)7701*67e74705SXin Li TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
7702*67e74705SXin Li   return getDerived().RebuildOMPProcBindClause(
7703*67e74705SXin Li       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
7704*67e74705SXin Li       C->getLParenLoc(), C->getLocEnd());
7705*67e74705SXin Li }
7706*67e74705SXin Li 
7707*67e74705SXin Li template <typename Derived>
7708*67e74705SXin Li OMPClause *
TransformOMPScheduleClause(OMPScheduleClause * C)7709*67e74705SXin Li TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
7710*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
7711*67e74705SXin Li   if (E.isInvalid())
7712*67e74705SXin Li     return nullptr;
7713*67e74705SXin Li   return getDerived().RebuildOMPScheduleClause(
7714*67e74705SXin Li       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
7715*67e74705SXin Li       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
7716*67e74705SXin Li       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
7717*67e74705SXin Li       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
7718*67e74705SXin Li }
7719*67e74705SXin Li 
7720*67e74705SXin Li template <typename Derived>
7721*67e74705SXin Li OMPClause *
TransformOMPOrderedClause(OMPOrderedClause * C)7722*67e74705SXin Li TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
7723*67e74705SXin Li   ExprResult E;
7724*67e74705SXin Li   if (auto *Num = C->getNumForLoops()) {
7725*67e74705SXin Li     E = getDerived().TransformExpr(Num);
7726*67e74705SXin Li     if (E.isInvalid())
7727*67e74705SXin Li       return nullptr;
7728*67e74705SXin Li   }
7729*67e74705SXin Li   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
7730*67e74705SXin Li                                               C->getLParenLoc(), E.get());
7731*67e74705SXin Li }
7732*67e74705SXin Li 
7733*67e74705SXin Li template <typename Derived>
7734*67e74705SXin Li OMPClause *
TransformOMPNowaitClause(OMPNowaitClause * C)7735*67e74705SXin Li TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
7736*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7737*67e74705SXin Li   return C;
7738*67e74705SXin Li }
7739*67e74705SXin Li 
7740*67e74705SXin Li template <typename Derived>
7741*67e74705SXin Li OMPClause *
TransformOMPUntiedClause(OMPUntiedClause * C)7742*67e74705SXin Li TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
7743*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7744*67e74705SXin Li   return C;
7745*67e74705SXin Li }
7746*67e74705SXin Li 
7747*67e74705SXin Li template <typename Derived>
7748*67e74705SXin Li OMPClause *
TransformOMPMergeableClause(OMPMergeableClause * C)7749*67e74705SXin Li TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7750*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7751*67e74705SXin Li   return C;
7752*67e74705SXin Li }
7753*67e74705SXin Li 
7754*67e74705SXin Li template <typename Derived>
TransformOMPReadClause(OMPReadClause * C)7755*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7756*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7757*67e74705SXin Li   return C;
7758*67e74705SXin Li }
7759*67e74705SXin Li 
7760*67e74705SXin Li template <typename Derived>
TransformOMPWriteClause(OMPWriteClause * C)7761*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7762*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7763*67e74705SXin Li   return C;
7764*67e74705SXin Li }
7765*67e74705SXin Li 
7766*67e74705SXin Li template <typename Derived>
7767*67e74705SXin Li OMPClause *
TransformOMPUpdateClause(OMPUpdateClause * C)7768*67e74705SXin Li TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7769*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7770*67e74705SXin Li   return C;
7771*67e74705SXin Li }
7772*67e74705SXin Li 
7773*67e74705SXin Li template <typename Derived>
7774*67e74705SXin Li OMPClause *
TransformOMPCaptureClause(OMPCaptureClause * C)7775*67e74705SXin Li TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7776*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7777*67e74705SXin Li   return C;
7778*67e74705SXin Li }
7779*67e74705SXin Li 
7780*67e74705SXin Li template <typename Derived>
7781*67e74705SXin Li OMPClause *
TransformOMPSeqCstClause(OMPSeqCstClause * C)7782*67e74705SXin Li TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7783*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7784*67e74705SXin Li   return C;
7785*67e74705SXin Li }
7786*67e74705SXin Li 
7787*67e74705SXin Li template <typename Derived>
7788*67e74705SXin Li OMPClause *
TransformOMPThreadsClause(OMPThreadsClause * C)7789*67e74705SXin Li TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
7790*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7791*67e74705SXin Li   return C;
7792*67e74705SXin Li }
7793*67e74705SXin Li 
7794*67e74705SXin Li template <typename Derived>
TransformOMPSIMDClause(OMPSIMDClause * C)7795*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
7796*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7797*67e74705SXin Li   return C;
7798*67e74705SXin Li }
7799*67e74705SXin Li 
7800*67e74705SXin Li template <typename Derived>
7801*67e74705SXin Li OMPClause *
TransformOMPNogroupClause(OMPNogroupClause * C)7802*67e74705SXin Li TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
7803*67e74705SXin Li   // No need to rebuild this clause, no template-dependent parameters.
7804*67e74705SXin Li   return C;
7805*67e74705SXin Li }
7806*67e74705SXin Li 
7807*67e74705SXin Li template <typename Derived>
7808*67e74705SXin Li OMPClause *
TransformOMPPrivateClause(OMPPrivateClause * C)7809*67e74705SXin Li TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7810*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7811*67e74705SXin Li   Vars.reserve(C->varlist_size());
7812*67e74705SXin Li   for (auto *VE : C->varlists()) {
7813*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7814*67e74705SXin Li     if (EVar.isInvalid())
7815*67e74705SXin Li       return nullptr;
7816*67e74705SXin Li     Vars.push_back(EVar.get());
7817*67e74705SXin Li   }
7818*67e74705SXin Li   return getDerived().RebuildOMPPrivateClause(
7819*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7820*67e74705SXin Li }
7821*67e74705SXin Li 
7822*67e74705SXin Li template <typename Derived>
TransformOMPFirstprivateClause(OMPFirstprivateClause * C)7823*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7824*67e74705SXin Li     OMPFirstprivateClause *C) {
7825*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7826*67e74705SXin Li   Vars.reserve(C->varlist_size());
7827*67e74705SXin Li   for (auto *VE : C->varlists()) {
7828*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7829*67e74705SXin Li     if (EVar.isInvalid())
7830*67e74705SXin Li       return nullptr;
7831*67e74705SXin Li     Vars.push_back(EVar.get());
7832*67e74705SXin Li   }
7833*67e74705SXin Li   return getDerived().RebuildOMPFirstprivateClause(
7834*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7835*67e74705SXin Li }
7836*67e74705SXin Li 
7837*67e74705SXin Li template <typename Derived>
7838*67e74705SXin Li OMPClause *
TransformOMPLastprivateClause(OMPLastprivateClause * C)7839*67e74705SXin Li TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
7840*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7841*67e74705SXin Li   Vars.reserve(C->varlist_size());
7842*67e74705SXin Li   for (auto *VE : C->varlists()) {
7843*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7844*67e74705SXin Li     if (EVar.isInvalid())
7845*67e74705SXin Li       return nullptr;
7846*67e74705SXin Li     Vars.push_back(EVar.get());
7847*67e74705SXin Li   }
7848*67e74705SXin Li   return getDerived().RebuildOMPLastprivateClause(
7849*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7850*67e74705SXin Li }
7851*67e74705SXin Li 
7852*67e74705SXin Li template <typename Derived>
7853*67e74705SXin Li OMPClause *
TransformOMPSharedClause(OMPSharedClause * C)7854*67e74705SXin Li TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
7855*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7856*67e74705SXin Li   Vars.reserve(C->varlist_size());
7857*67e74705SXin Li   for (auto *VE : C->varlists()) {
7858*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7859*67e74705SXin Li     if (EVar.isInvalid())
7860*67e74705SXin Li       return nullptr;
7861*67e74705SXin Li     Vars.push_back(EVar.get());
7862*67e74705SXin Li   }
7863*67e74705SXin Li   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
7864*67e74705SXin Li                                              C->getLParenLoc(), C->getLocEnd());
7865*67e74705SXin Li }
7866*67e74705SXin Li 
7867*67e74705SXin Li template <typename Derived>
7868*67e74705SXin Li OMPClause *
TransformOMPReductionClause(OMPReductionClause * C)7869*67e74705SXin Li TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
7870*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7871*67e74705SXin Li   Vars.reserve(C->varlist_size());
7872*67e74705SXin Li   for (auto *VE : C->varlists()) {
7873*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7874*67e74705SXin Li     if (EVar.isInvalid())
7875*67e74705SXin Li       return nullptr;
7876*67e74705SXin Li     Vars.push_back(EVar.get());
7877*67e74705SXin Li   }
7878*67e74705SXin Li   CXXScopeSpec ReductionIdScopeSpec;
7879*67e74705SXin Li   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
7880*67e74705SXin Li 
7881*67e74705SXin Li   DeclarationNameInfo NameInfo = C->getNameInfo();
7882*67e74705SXin Li   if (NameInfo.getName()) {
7883*67e74705SXin Li     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7884*67e74705SXin Li     if (!NameInfo.getName())
7885*67e74705SXin Li       return nullptr;
7886*67e74705SXin Li   }
7887*67e74705SXin Li   // Build a list of all UDR decls with the same names ranged by the Scopes.
7888*67e74705SXin Li   // The Scope boundary is a duplication of the previous decl.
7889*67e74705SXin Li   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
7890*67e74705SXin Li   for (auto *E : C->reduction_ops()) {
7891*67e74705SXin Li     // Transform all the decls.
7892*67e74705SXin Li     if (E) {
7893*67e74705SXin Li       auto *ULE = cast<UnresolvedLookupExpr>(E);
7894*67e74705SXin Li       UnresolvedSet<8> Decls;
7895*67e74705SXin Li       for (auto *D : ULE->decls()) {
7896*67e74705SXin Li         NamedDecl *InstD =
7897*67e74705SXin Li             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
7898*67e74705SXin Li         Decls.addDecl(InstD, InstD->getAccess());
7899*67e74705SXin Li       }
7900*67e74705SXin Li       UnresolvedReductions.push_back(
7901*67e74705SXin Li        UnresolvedLookupExpr::Create(
7902*67e74705SXin Li           SemaRef.Context, /*NamingClass=*/nullptr,
7903*67e74705SXin Li           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
7904*67e74705SXin Li           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
7905*67e74705SXin Li           Decls.begin(), Decls.end()));
7906*67e74705SXin Li     } else
7907*67e74705SXin Li       UnresolvedReductions.push_back(nullptr);
7908*67e74705SXin Li   }
7909*67e74705SXin Li   return getDerived().RebuildOMPReductionClause(
7910*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
7911*67e74705SXin Li       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
7912*67e74705SXin Li }
7913*67e74705SXin Li 
7914*67e74705SXin Li template <typename Derived>
7915*67e74705SXin Li OMPClause *
TransformOMPLinearClause(OMPLinearClause * C)7916*67e74705SXin Li TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
7917*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7918*67e74705SXin Li   Vars.reserve(C->varlist_size());
7919*67e74705SXin Li   for (auto *VE : C->varlists()) {
7920*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7921*67e74705SXin Li     if (EVar.isInvalid())
7922*67e74705SXin Li       return nullptr;
7923*67e74705SXin Li     Vars.push_back(EVar.get());
7924*67e74705SXin Li   }
7925*67e74705SXin Li   ExprResult Step = getDerived().TransformExpr(C->getStep());
7926*67e74705SXin Li   if (Step.isInvalid())
7927*67e74705SXin Li     return nullptr;
7928*67e74705SXin Li   return getDerived().RebuildOMPLinearClause(
7929*67e74705SXin Li       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
7930*67e74705SXin Li       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
7931*67e74705SXin Li }
7932*67e74705SXin Li 
7933*67e74705SXin Li template <typename Derived>
7934*67e74705SXin Li OMPClause *
TransformOMPAlignedClause(OMPAlignedClause * C)7935*67e74705SXin Li TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
7936*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7937*67e74705SXin Li   Vars.reserve(C->varlist_size());
7938*67e74705SXin Li   for (auto *VE : C->varlists()) {
7939*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7940*67e74705SXin Li     if (EVar.isInvalid())
7941*67e74705SXin Li       return nullptr;
7942*67e74705SXin Li     Vars.push_back(EVar.get());
7943*67e74705SXin Li   }
7944*67e74705SXin Li   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
7945*67e74705SXin Li   if (Alignment.isInvalid())
7946*67e74705SXin Li     return nullptr;
7947*67e74705SXin Li   return getDerived().RebuildOMPAlignedClause(
7948*67e74705SXin Li       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
7949*67e74705SXin Li       C->getColonLoc(), C->getLocEnd());
7950*67e74705SXin Li }
7951*67e74705SXin Li 
7952*67e74705SXin Li template <typename Derived>
7953*67e74705SXin Li OMPClause *
TransformOMPCopyinClause(OMPCopyinClause * C)7954*67e74705SXin Li TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
7955*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7956*67e74705SXin Li   Vars.reserve(C->varlist_size());
7957*67e74705SXin Li   for (auto *VE : C->varlists()) {
7958*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7959*67e74705SXin Li     if (EVar.isInvalid())
7960*67e74705SXin Li       return nullptr;
7961*67e74705SXin Li     Vars.push_back(EVar.get());
7962*67e74705SXin Li   }
7963*67e74705SXin Li   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
7964*67e74705SXin Li                                              C->getLParenLoc(), C->getLocEnd());
7965*67e74705SXin Li }
7966*67e74705SXin Li 
7967*67e74705SXin Li template <typename Derived>
7968*67e74705SXin Li OMPClause *
TransformOMPCopyprivateClause(OMPCopyprivateClause * C)7969*67e74705SXin Li TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
7970*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7971*67e74705SXin Li   Vars.reserve(C->varlist_size());
7972*67e74705SXin Li   for (auto *VE : C->varlists()) {
7973*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7974*67e74705SXin Li     if (EVar.isInvalid())
7975*67e74705SXin Li       return nullptr;
7976*67e74705SXin Li     Vars.push_back(EVar.get());
7977*67e74705SXin Li   }
7978*67e74705SXin Li   return getDerived().RebuildOMPCopyprivateClause(
7979*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7980*67e74705SXin Li }
7981*67e74705SXin Li 
7982*67e74705SXin Li template <typename Derived>
TransformOMPFlushClause(OMPFlushClause * C)7983*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
7984*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
7985*67e74705SXin Li   Vars.reserve(C->varlist_size());
7986*67e74705SXin Li   for (auto *VE : C->varlists()) {
7987*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7988*67e74705SXin Li     if (EVar.isInvalid())
7989*67e74705SXin Li       return nullptr;
7990*67e74705SXin Li     Vars.push_back(EVar.get());
7991*67e74705SXin Li   }
7992*67e74705SXin Li   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
7993*67e74705SXin Li                                             C->getLParenLoc(), C->getLocEnd());
7994*67e74705SXin Li }
7995*67e74705SXin Li 
7996*67e74705SXin Li template <typename Derived>
7997*67e74705SXin Li OMPClause *
TransformOMPDependClause(OMPDependClause * C)7998*67e74705SXin Li TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
7999*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
8000*67e74705SXin Li   Vars.reserve(C->varlist_size());
8001*67e74705SXin Li   for (auto *VE : C->varlists()) {
8002*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8003*67e74705SXin Li     if (EVar.isInvalid())
8004*67e74705SXin Li       return nullptr;
8005*67e74705SXin Li     Vars.push_back(EVar.get());
8006*67e74705SXin Li   }
8007*67e74705SXin Li   return getDerived().RebuildOMPDependClause(
8008*67e74705SXin Li       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8009*67e74705SXin Li       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8010*67e74705SXin Li }
8011*67e74705SXin Li 
8012*67e74705SXin Li template <typename Derived>
8013*67e74705SXin Li OMPClause *
TransformOMPDeviceClause(OMPDeviceClause * C)8014*67e74705SXin Li TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8015*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getDevice());
8016*67e74705SXin Li   if (E.isInvalid())
8017*67e74705SXin Li     return nullptr;
8018*67e74705SXin Li   return getDerived().RebuildOMPDeviceClause(
8019*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8020*67e74705SXin Li }
8021*67e74705SXin Li 
8022*67e74705SXin Li template <typename Derived>
TransformOMPMapClause(OMPMapClause * C)8023*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8024*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
8025*67e74705SXin Li   Vars.reserve(C->varlist_size());
8026*67e74705SXin Li   for (auto *VE : C->varlists()) {
8027*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8028*67e74705SXin Li     if (EVar.isInvalid())
8029*67e74705SXin Li       return nullptr;
8030*67e74705SXin Li     Vars.push_back(EVar.get());
8031*67e74705SXin Li   }
8032*67e74705SXin Li   return getDerived().RebuildOMPMapClause(
8033*67e74705SXin Li       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8034*67e74705SXin Li       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8035*67e74705SXin Li       C->getLParenLoc(), C->getLocEnd());
8036*67e74705SXin Li }
8037*67e74705SXin Li 
8038*67e74705SXin Li template <typename Derived>
8039*67e74705SXin Li OMPClause *
TransformOMPNumTeamsClause(OMPNumTeamsClause * C)8040*67e74705SXin Li TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8041*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8042*67e74705SXin Li   if (E.isInvalid())
8043*67e74705SXin Li     return nullptr;
8044*67e74705SXin Li   return getDerived().RebuildOMPNumTeamsClause(
8045*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8046*67e74705SXin Li }
8047*67e74705SXin Li 
8048*67e74705SXin Li template <typename Derived>
8049*67e74705SXin Li OMPClause *
TransformOMPThreadLimitClause(OMPThreadLimitClause * C)8050*67e74705SXin Li TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8051*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8052*67e74705SXin Li   if (E.isInvalid())
8053*67e74705SXin Li     return nullptr;
8054*67e74705SXin Li   return getDerived().RebuildOMPThreadLimitClause(
8055*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8056*67e74705SXin Li }
8057*67e74705SXin Li 
8058*67e74705SXin Li template <typename Derived>
8059*67e74705SXin Li OMPClause *
TransformOMPPriorityClause(OMPPriorityClause * C)8060*67e74705SXin Li TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8061*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getPriority());
8062*67e74705SXin Li   if (E.isInvalid())
8063*67e74705SXin Li     return nullptr;
8064*67e74705SXin Li   return getDerived().RebuildOMPPriorityClause(
8065*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8066*67e74705SXin Li }
8067*67e74705SXin Li 
8068*67e74705SXin Li template <typename Derived>
8069*67e74705SXin Li OMPClause *
TransformOMPGrainsizeClause(OMPGrainsizeClause * C)8070*67e74705SXin Li TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8071*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8072*67e74705SXin Li   if (E.isInvalid())
8073*67e74705SXin Li     return nullptr;
8074*67e74705SXin Li   return getDerived().RebuildOMPGrainsizeClause(
8075*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8076*67e74705SXin Li }
8077*67e74705SXin Li 
8078*67e74705SXin Li template <typename Derived>
8079*67e74705SXin Li OMPClause *
TransformOMPNumTasksClause(OMPNumTasksClause * C)8080*67e74705SXin Li TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8081*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8082*67e74705SXin Li   if (E.isInvalid())
8083*67e74705SXin Li     return nullptr;
8084*67e74705SXin Li   return getDerived().RebuildOMPNumTasksClause(
8085*67e74705SXin Li       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8086*67e74705SXin Li }
8087*67e74705SXin Li 
8088*67e74705SXin Li template <typename Derived>
TransformOMPHintClause(OMPHintClause * C)8089*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8090*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getHint());
8091*67e74705SXin Li   if (E.isInvalid())
8092*67e74705SXin Li     return nullptr;
8093*67e74705SXin Li   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8094*67e74705SXin Li                                            C->getLParenLoc(), C->getLocEnd());
8095*67e74705SXin Li }
8096*67e74705SXin Li 
8097*67e74705SXin Li template <typename Derived>
TransformOMPDistScheduleClause(OMPDistScheduleClause * C)8098*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8099*67e74705SXin Li     OMPDistScheduleClause *C) {
8100*67e74705SXin Li   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8101*67e74705SXin Li   if (E.isInvalid())
8102*67e74705SXin Li     return nullptr;
8103*67e74705SXin Li   return getDerived().RebuildOMPDistScheduleClause(
8104*67e74705SXin Li       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8105*67e74705SXin Li       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8106*67e74705SXin Li }
8107*67e74705SXin Li 
8108*67e74705SXin Li template <typename Derived>
8109*67e74705SXin Li OMPClause *
TransformOMPDefaultmapClause(OMPDefaultmapClause * C)8110*67e74705SXin Li TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8111*67e74705SXin Li   return C;
8112*67e74705SXin Li }
8113*67e74705SXin Li 
8114*67e74705SXin Li template <typename Derived>
TransformOMPToClause(OMPToClause * C)8115*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8116*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
8117*67e74705SXin Li   Vars.reserve(C->varlist_size());
8118*67e74705SXin Li   for (auto *VE : C->varlists()) {
8119*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8120*67e74705SXin Li     if (EVar.isInvalid())
8121*67e74705SXin Li       return 0;
8122*67e74705SXin Li     Vars.push_back(EVar.get());
8123*67e74705SXin Li   }
8124*67e74705SXin Li   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8125*67e74705SXin Li                                          C->getLParenLoc(), C->getLocEnd());
8126*67e74705SXin Li }
8127*67e74705SXin Li 
8128*67e74705SXin Li template <typename Derived>
TransformOMPFromClause(OMPFromClause * C)8129*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8130*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
8131*67e74705SXin Li   Vars.reserve(C->varlist_size());
8132*67e74705SXin Li   for (auto *VE : C->varlists()) {
8133*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8134*67e74705SXin Li     if (EVar.isInvalid())
8135*67e74705SXin Li       return 0;
8136*67e74705SXin Li     Vars.push_back(EVar.get());
8137*67e74705SXin Li   }
8138*67e74705SXin Li   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8139*67e74705SXin Li                                            C->getLParenLoc(), C->getLocEnd());
8140*67e74705SXin Li }
8141*67e74705SXin Li 
8142*67e74705SXin Li template <typename Derived>
TransformOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)8143*67e74705SXin Li OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8144*67e74705SXin Li     OMPUseDevicePtrClause *C) {
8145*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
8146*67e74705SXin Li   Vars.reserve(C->varlist_size());
8147*67e74705SXin Li   for (auto *VE : C->varlists()) {
8148*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8149*67e74705SXin Li     if (EVar.isInvalid())
8150*67e74705SXin Li       return nullptr;
8151*67e74705SXin Li     Vars.push_back(EVar.get());
8152*67e74705SXin Li   }
8153*67e74705SXin Li   return getDerived().RebuildOMPUseDevicePtrClause(
8154*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8155*67e74705SXin Li }
8156*67e74705SXin Li 
8157*67e74705SXin Li template <typename Derived>
8158*67e74705SXin Li OMPClause *
TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)8159*67e74705SXin Li TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8160*67e74705SXin Li   llvm::SmallVector<Expr *, 16> Vars;
8161*67e74705SXin Li   Vars.reserve(C->varlist_size());
8162*67e74705SXin Li   for (auto *VE : C->varlists()) {
8163*67e74705SXin Li     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8164*67e74705SXin Li     if (EVar.isInvalid())
8165*67e74705SXin Li       return nullptr;
8166*67e74705SXin Li     Vars.push_back(EVar.get());
8167*67e74705SXin Li   }
8168*67e74705SXin Li   return getDerived().RebuildOMPIsDevicePtrClause(
8169*67e74705SXin Li       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8170*67e74705SXin Li }
8171*67e74705SXin Li 
8172*67e74705SXin Li //===----------------------------------------------------------------------===//
8173*67e74705SXin Li // Expression transformation
8174*67e74705SXin Li //===----------------------------------------------------------------------===//
8175*67e74705SXin Li template<typename Derived>
8176*67e74705SXin Li ExprResult
TransformPredefinedExpr(PredefinedExpr * E)8177*67e74705SXin Li TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8178*67e74705SXin Li   if (!E->isTypeDependent())
8179*67e74705SXin Li     return E;
8180*67e74705SXin Li 
8181*67e74705SXin Li   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8182*67e74705SXin Li                                             E->getIdentType());
8183*67e74705SXin Li }
8184*67e74705SXin Li 
8185*67e74705SXin Li template<typename Derived>
8186*67e74705SXin Li ExprResult
TransformDeclRefExpr(DeclRefExpr * E)8187*67e74705SXin Li TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8188*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
8189*67e74705SXin Li   if (E->getQualifierLoc()) {
8190*67e74705SXin Li     QualifierLoc
8191*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8192*67e74705SXin Li     if (!QualifierLoc)
8193*67e74705SXin Li       return ExprError();
8194*67e74705SXin Li   }
8195*67e74705SXin Li 
8196*67e74705SXin Li   ValueDecl *ND
8197*67e74705SXin Li     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8198*67e74705SXin Li                                                          E->getDecl()));
8199*67e74705SXin Li   if (!ND)
8200*67e74705SXin Li     return ExprError();
8201*67e74705SXin Li 
8202*67e74705SXin Li   DeclarationNameInfo NameInfo = E->getNameInfo();
8203*67e74705SXin Li   if (NameInfo.getName()) {
8204*67e74705SXin Li     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8205*67e74705SXin Li     if (!NameInfo.getName())
8206*67e74705SXin Li       return ExprError();
8207*67e74705SXin Li   }
8208*67e74705SXin Li 
8209*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8210*67e74705SXin Li       QualifierLoc == E->getQualifierLoc() &&
8211*67e74705SXin Li       ND == E->getDecl() &&
8212*67e74705SXin Li       NameInfo.getName() == E->getDecl()->getDeclName() &&
8213*67e74705SXin Li       !E->hasExplicitTemplateArgs()) {
8214*67e74705SXin Li 
8215*67e74705SXin Li     // Mark it referenced in the new context regardless.
8216*67e74705SXin Li     // FIXME: this is a bit instantiation-specific.
8217*67e74705SXin Li     SemaRef.MarkDeclRefReferenced(E);
8218*67e74705SXin Li 
8219*67e74705SXin Li     return E;
8220*67e74705SXin Li   }
8221*67e74705SXin Li 
8222*67e74705SXin Li   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8223*67e74705SXin Li   if (E->hasExplicitTemplateArgs()) {
8224*67e74705SXin Li     TemplateArgs = &TransArgs;
8225*67e74705SXin Li     TransArgs.setLAngleLoc(E->getLAngleLoc());
8226*67e74705SXin Li     TransArgs.setRAngleLoc(E->getRAngleLoc());
8227*67e74705SXin Li     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8228*67e74705SXin Li                                                 E->getNumTemplateArgs(),
8229*67e74705SXin Li                                                 TransArgs))
8230*67e74705SXin Li       return ExprError();
8231*67e74705SXin Li   }
8232*67e74705SXin Li 
8233*67e74705SXin Li   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8234*67e74705SXin Li                                          TemplateArgs);
8235*67e74705SXin Li }
8236*67e74705SXin Li 
8237*67e74705SXin Li template<typename Derived>
8238*67e74705SXin Li ExprResult
TransformIntegerLiteral(IntegerLiteral * E)8239*67e74705SXin Li TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8240*67e74705SXin Li   return E;
8241*67e74705SXin Li }
8242*67e74705SXin Li 
8243*67e74705SXin Li template<typename Derived>
8244*67e74705SXin Li ExprResult
TransformFloatingLiteral(FloatingLiteral * E)8245*67e74705SXin Li TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8246*67e74705SXin Li   return E;
8247*67e74705SXin Li }
8248*67e74705SXin Li 
8249*67e74705SXin Li template<typename Derived>
8250*67e74705SXin Li ExprResult
TransformImaginaryLiteral(ImaginaryLiteral * E)8251*67e74705SXin Li TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8252*67e74705SXin Li   return E;
8253*67e74705SXin Li }
8254*67e74705SXin Li 
8255*67e74705SXin Li template<typename Derived>
8256*67e74705SXin Li ExprResult
TransformStringLiteral(StringLiteral * E)8257*67e74705SXin Li TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8258*67e74705SXin Li   return E;
8259*67e74705SXin Li }
8260*67e74705SXin Li 
8261*67e74705SXin Li template<typename Derived>
8262*67e74705SXin Li ExprResult
TransformCharacterLiteral(CharacterLiteral * E)8263*67e74705SXin Li TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8264*67e74705SXin Li   return E;
8265*67e74705SXin Li }
8266*67e74705SXin Li 
8267*67e74705SXin Li template<typename Derived>
8268*67e74705SXin Li ExprResult
TransformUserDefinedLiteral(UserDefinedLiteral * E)8269*67e74705SXin Li TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8270*67e74705SXin Li   if (FunctionDecl *FD = E->getDirectCallee())
8271*67e74705SXin Li     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8272*67e74705SXin Li   return SemaRef.MaybeBindToTemporary(E);
8273*67e74705SXin Li }
8274*67e74705SXin Li 
8275*67e74705SXin Li template<typename Derived>
8276*67e74705SXin Li ExprResult
TransformGenericSelectionExpr(GenericSelectionExpr * E)8277*67e74705SXin Li TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8278*67e74705SXin Li   ExprResult ControllingExpr =
8279*67e74705SXin Li     getDerived().TransformExpr(E->getControllingExpr());
8280*67e74705SXin Li   if (ControllingExpr.isInvalid())
8281*67e74705SXin Li     return ExprError();
8282*67e74705SXin Li 
8283*67e74705SXin Li   SmallVector<Expr *, 4> AssocExprs;
8284*67e74705SXin Li   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8285*67e74705SXin Li   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8286*67e74705SXin Li     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8287*67e74705SXin Li     if (TS) {
8288*67e74705SXin Li       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8289*67e74705SXin Li       if (!AssocType)
8290*67e74705SXin Li         return ExprError();
8291*67e74705SXin Li       AssocTypes.push_back(AssocType);
8292*67e74705SXin Li     } else {
8293*67e74705SXin Li       AssocTypes.push_back(nullptr);
8294*67e74705SXin Li     }
8295*67e74705SXin Li 
8296*67e74705SXin Li     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8297*67e74705SXin Li     if (AssocExpr.isInvalid())
8298*67e74705SXin Li       return ExprError();
8299*67e74705SXin Li     AssocExprs.push_back(AssocExpr.get());
8300*67e74705SXin Li   }
8301*67e74705SXin Li 
8302*67e74705SXin Li   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8303*67e74705SXin Li                                                   E->getDefaultLoc(),
8304*67e74705SXin Li                                                   E->getRParenLoc(),
8305*67e74705SXin Li                                                   ControllingExpr.get(),
8306*67e74705SXin Li                                                   AssocTypes,
8307*67e74705SXin Li                                                   AssocExprs);
8308*67e74705SXin Li }
8309*67e74705SXin Li 
8310*67e74705SXin Li template<typename Derived>
8311*67e74705SXin Li ExprResult
TransformParenExpr(ParenExpr * E)8312*67e74705SXin Li TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8313*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8314*67e74705SXin Li   if (SubExpr.isInvalid())
8315*67e74705SXin Li     return ExprError();
8316*67e74705SXin Li 
8317*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8318*67e74705SXin Li     return E;
8319*67e74705SXin Li 
8320*67e74705SXin Li   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8321*67e74705SXin Li                                        E->getRParen());
8322*67e74705SXin Li }
8323*67e74705SXin Li 
8324*67e74705SXin Li /// \brief The operand of a unary address-of operator has special rules: it's
8325*67e74705SXin Li /// allowed to refer to a non-static member of a class even if there's no 'this'
8326*67e74705SXin Li /// object available.
8327*67e74705SXin Li template<typename Derived>
8328*67e74705SXin Li ExprResult
TransformAddressOfOperand(Expr * E)8329*67e74705SXin Li TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8330*67e74705SXin Li   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8331*67e74705SXin Li     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8332*67e74705SXin Li   else
8333*67e74705SXin Li     return getDerived().TransformExpr(E);
8334*67e74705SXin Li }
8335*67e74705SXin Li 
8336*67e74705SXin Li template<typename Derived>
8337*67e74705SXin Li ExprResult
TransformUnaryOperator(UnaryOperator * E)8338*67e74705SXin Li TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8339*67e74705SXin Li   ExprResult SubExpr;
8340*67e74705SXin Li   if (E->getOpcode() == UO_AddrOf)
8341*67e74705SXin Li     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8342*67e74705SXin Li   else
8343*67e74705SXin Li     SubExpr = TransformExpr(E->getSubExpr());
8344*67e74705SXin Li   if (SubExpr.isInvalid())
8345*67e74705SXin Li     return ExprError();
8346*67e74705SXin Li 
8347*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8348*67e74705SXin Li     return E;
8349*67e74705SXin Li 
8350*67e74705SXin Li   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8351*67e74705SXin Li                                            E->getOpcode(),
8352*67e74705SXin Li                                            SubExpr.get());
8353*67e74705SXin Li }
8354*67e74705SXin Li 
8355*67e74705SXin Li template<typename Derived>
8356*67e74705SXin Li ExprResult
TransformOffsetOfExpr(OffsetOfExpr * E)8357*67e74705SXin Li TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
8358*67e74705SXin Li   // Transform the type.
8359*67e74705SXin Li   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
8360*67e74705SXin Li   if (!Type)
8361*67e74705SXin Li     return ExprError();
8362*67e74705SXin Li 
8363*67e74705SXin Li   // Transform all of the components into components similar to what the
8364*67e74705SXin Li   // parser uses.
8365*67e74705SXin Li   // FIXME: It would be slightly more efficient in the non-dependent case to
8366*67e74705SXin Li   // just map FieldDecls, rather than requiring the rebuilder to look for
8367*67e74705SXin Li   // the fields again. However, __builtin_offsetof is rare enough in
8368*67e74705SXin Li   // template code that we don't care.
8369*67e74705SXin Li   bool ExprChanged = false;
8370*67e74705SXin Li   typedef Sema::OffsetOfComponent Component;
8371*67e74705SXin Li   SmallVector<Component, 4> Components;
8372*67e74705SXin Li   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
8373*67e74705SXin Li     const OffsetOfNode &ON = E->getComponent(I);
8374*67e74705SXin Li     Component Comp;
8375*67e74705SXin Li     Comp.isBrackets = true;
8376*67e74705SXin Li     Comp.LocStart = ON.getSourceRange().getBegin();
8377*67e74705SXin Li     Comp.LocEnd = ON.getSourceRange().getEnd();
8378*67e74705SXin Li     switch (ON.getKind()) {
8379*67e74705SXin Li     case OffsetOfNode::Array: {
8380*67e74705SXin Li       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
8381*67e74705SXin Li       ExprResult Index = getDerived().TransformExpr(FromIndex);
8382*67e74705SXin Li       if (Index.isInvalid())
8383*67e74705SXin Li         return ExprError();
8384*67e74705SXin Li 
8385*67e74705SXin Li       ExprChanged = ExprChanged || Index.get() != FromIndex;
8386*67e74705SXin Li       Comp.isBrackets = true;
8387*67e74705SXin Li       Comp.U.E = Index.get();
8388*67e74705SXin Li       break;
8389*67e74705SXin Li     }
8390*67e74705SXin Li 
8391*67e74705SXin Li     case OffsetOfNode::Field:
8392*67e74705SXin Li     case OffsetOfNode::Identifier:
8393*67e74705SXin Li       Comp.isBrackets = false;
8394*67e74705SXin Li       Comp.U.IdentInfo = ON.getFieldName();
8395*67e74705SXin Li       if (!Comp.U.IdentInfo)
8396*67e74705SXin Li         continue;
8397*67e74705SXin Li 
8398*67e74705SXin Li       break;
8399*67e74705SXin Li 
8400*67e74705SXin Li     case OffsetOfNode::Base:
8401*67e74705SXin Li       // Will be recomputed during the rebuild.
8402*67e74705SXin Li       continue;
8403*67e74705SXin Li     }
8404*67e74705SXin Li 
8405*67e74705SXin Li     Components.push_back(Comp);
8406*67e74705SXin Li   }
8407*67e74705SXin Li 
8408*67e74705SXin Li   // If nothing changed, retain the existing expression.
8409*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8410*67e74705SXin Li       Type == E->getTypeSourceInfo() &&
8411*67e74705SXin Li       !ExprChanged)
8412*67e74705SXin Li     return E;
8413*67e74705SXin Li 
8414*67e74705SXin Li   // Build a new offsetof expression.
8415*67e74705SXin Li   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
8416*67e74705SXin Li                                           Components, E->getRParenLoc());
8417*67e74705SXin Li }
8418*67e74705SXin Li 
8419*67e74705SXin Li template<typename Derived>
8420*67e74705SXin Li ExprResult
TransformOpaqueValueExpr(OpaqueValueExpr * E)8421*67e74705SXin Li TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
8422*67e74705SXin Li   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
8423*67e74705SXin Li          "opaque value expression requires transformation");
8424*67e74705SXin Li   return E;
8425*67e74705SXin Li }
8426*67e74705SXin Li 
8427*67e74705SXin Li template<typename Derived>
8428*67e74705SXin Li ExprResult
TransformTypoExpr(TypoExpr * E)8429*67e74705SXin Li TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
8430*67e74705SXin Li   return E;
8431*67e74705SXin Li }
8432*67e74705SXin Li 
8433*67e74705SXin Li template<typename Derived>
8434*67e74705SXin Li ExprResult
TransformPseudoObjectExpr(PseudoObjectExpr * E)8435*67e74705SXin Li TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
8436*67e74705SXin Li   // Rebuild the syntactic form.  The original syntactic form has
8437*67e74705SXin Li   // opaque-value expressions in it, so strip those away and rebuild
8438*67e74705SXin Li   // the result.  This is a really awful way of doing this, but the
8439*67e74705SXin Li   // better solution (rebuilding the semantic expressions and
8440*67e74705SXin Li   // rebinding OVEs as necessary) doesn't work; we'd need
8441*67e74705SXin Li   // TreeTransform to not strip away implicit conversions.
8442*67e74705SXin Li   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
8443*67e74705SXin Li   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
8444*67e74705SXin Li   if (result.isInvalid()) return ExprError();
8445*67e74705SXin Li 
8446*67e74705SXin Li   // If that gives us a pseudo-object result back, the pseudo-object
8447*67e74705SXin Li   // expression must have been an lvalue-to-rvalue conversion which we
8448*67e74705SXin Li   // should reapply.
8449*67e74705SXin Li   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
8450*67e74705SXin Li     result = SemaRef.checkPseudoObjectRValue(result.get());
8451*67e74705SXin Li 
8452*67e74705SXin Li   return result;
8453*67e74705SXin Li }
8454*67e74705SXin Li 
8455*67e74705SXin Li template<typename Derived>
8456*67e74705SXin Li ExprResult
TransformUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)8457*67e74705SXin Li TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
8458*67e74705SXin Li                                                 UnaryExprOrTypeTraitExpr *E) {
8459*67e74705SXin Li   if (E->isArgumentType()) {
8460*67e74705SXin Li     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
8461*67e74705SXin Li 
8462*67e74705SXin Li     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8463*67e74705SXin Li     if (!NewT)
8464*67e74705SXin Li       return ExprError();
8465*67e74705SXin Li 
8466*67e74705SXin Li     if (!getDerived().AlwaysRebuild() && OldT == NewT)
8467*67e74705SXin Li       return E;
8468*67e74705SXin Li 
8469*67e74705SXin Li     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
8470*67e74705SXin Li                                                     E->getKind(),
8471*67e74705SXin Li                                                     E->getSourceRange());
8472*67e74705SXin Li   }
8473*67e74705SXin Li 
8474*67e74705SXin Li   // C++0x [expr.sizeof]p1:
8475*67e74705SXin Li   //   The operand is either an expression, which is an unevaluated operand
8476*67e74705SXin Li   //   [...]
8477*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8478*67e74705SXin Li                                                Sema::ReuseLambdaContextDecl);
8479*67e74705SXin Li 
8480*67e74705SXin Li   // Try to recover if we have something like sizeof(T::X) where X is a type.
8481*67e74705SXin Li   // Notably, there must be *exactly* one set of parens if X is a type.
8482*67e74705SXin Li   TypeSourceInfo *RecoveryTSI = nullptr;
8483*67e74705SXin Li   ExprResult SubExpr;
8484*67e74705SXin Li   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
8485*67e74705SXin Li   if (auto *DRE =
8486*67e74705SXin Li           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
8487*67e74705SXin Li     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
8488*67e74705SXin Li         PE, DRE, false, &RecoveryTSI);
8489*67e74705SXin Li   else
8490*67e74705SXin Li     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
8491*67e74705SXin Li 
8492*67e74705SXin Li   if (RecoveryTSI) {
8493*67e74705SXin Li     return getDerived().RebuildUnaryExprOrTypeTrait(
8494*67e74705SXin Li         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
8495*67e74705SXin Li   } else if (SubExpr.isInvalid())
8496*67e74705SXin Li     return ExprError();
8497*67e74705SXin Li 
8498*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
8499*67e74705SXin Li     return E;
8500*67e74705SXin Li 
8501*67e74705SXin Li   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
8502*67e74705SXin Li                                                   E->getOperatorLoc(),
8503*67e74705SXin Li                                                   E->getKind(),
8504*67e74705SXin Li                                                   E->getSourceRange());
8505*67e74705SXin Li }
8506*67e74705SXin Li 
8507*67e74705SXin Li template<typename Derived>
8508*67e74705SXin Li ExprResult
TransformArraySubscriptExpr(ArraySubscriptExpr * E)8509*67e74705SXin Li TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
8510*67e74705SXin Li   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8511*67e74705SXin Li   if (LHS.isInvalid())
8512*67e74705SXin Li     return ExprError();
8513*67e74705SXin Li 
8514*67e74705SXin Li   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8515*67e74705SXin Li   if (RHS.isInvalid())
8516*67e74705SXin Li     return ExprError();
8517*67e74705SXin Li 
8518*67e74705SXin Li 
8519*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8520*67e74705SXin Li       LHS.get() == E->getLHS() &&
8521*67e74705SXin Li       RHS.get() == E->getRHS())
8522*67e74705SXin Li     return E;
8523*67e74705SXin Li 
8524*67e74705SXin Li   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
8525*67e74705SXin Li                                            /*FIXME:*/E->getLHS()->getLocStart(),
8526*67e74705SXin Li                                                 RHS.get(),
8527*67e74705SXin Li                                                 E->getRBracketLoc());
8528*67e74705SXin Li }
8529*67e74705SXin Li 
8530*67e74705SXin Li template <typename Derived>
8531*67e74705SXin Li ExprResult
TransformOMPArraySectionExpr(OMPArraySectionExpr * E)8532*67e74705SXin Li TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
8533*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
8534*67e74705SXin Li   if (Base.isInvalid())
8535*67e74705SXin Li     return ExprError();
8536*67e74705SXin Li 
8537*67e74705SXin Li   ExprResult LowerBound;
8538*67e74705SXin Li   if (E->getLowerBound()) {
8539*67e74705SXin Li     LowerBound = getDerived().TransformExpr(E->getLowerBound());
8540*67e74705SXin Li     if (LowerBound.isInvalid())
8541*67e74705SXin Li       return ExprError();
8542*67e74705SXin Li   }
8543*67e74705SXin Li 
8544*67e74705SXin Li   ExprResult Length;
8545*67e74705SXin Li   if (E->getLength()) {
8546*67e74705SXin Li     Length = getDerived().TransformExpr(E->getLength());
8547*67e74705SXin Li     if (Length.isInvalid())
8548*67e74705SXin Li       return ExprError();
8549*67e74705SXin Li   }
8550*67e74705SXin Li 
8551*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
8552*67e74705SXin Li       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
8553*67e74705SXin Li     return E;
8554*67e74705SXin Li 
8555*67e74705SXin Li   return getDerived().RebuildOMPArraySectionExpr(
8556*67e74705SXin Li       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
8557*67e74705SXin Li       Length.get(), E->getRBracketLoc());
8558*67e74705SXin Li }
8559*67e74705SXin Li 
8560*67e74705SXin Li template<typename Derived>
8561*67e74705SXin Li ExprResult
TransformCallExpr(CallExpr * E)8562*67e74705SXin Li TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
8563*67e74705SXin Li   // Transform the callee.
8564*67e74705SXin Li   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8565*67e74705SXin Li   if (Callee.isInvalid())
8566*67e74705SXin Li     return ExprError();
8567*67e74705SXin Li 
8568*67e74705SXin Li   // Transform arguments.
8569*67e74705SXin Li   bool ArgChanged = false;
8570*67e74705SXin Li   SmallVector<Expr*, 8> Args;
8571*67e74705SXin Li   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8572*67e74705SXin Li                                   &ArgChanged))
8573*67e74705SXin Li     return ExprError();
8574*67e74705SXin Li 
8575*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8576*67e74705SXin Li       Callee.get() == E->getCallee() &&
8577*67e74705SXin Li       !ArgChanged)
8578*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
8579*67e74705SXin Li 
8580*67e74705SXin Li   // FIXME: Wrong source location information for the '('.
8581*67e74705SXin Li   SourceLocation FakeLParenLoc
8582*67e74705SXin Li     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8583*67e74705SXin Li   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8584*67e74705SXin Li                                       Args,
8585*67e74705SXin Li                                       E->getRParenLoc());
8586*67e74705SXin Li }
8587*67e74705SXin Li 
8588*67e74705SXin Li template<typename Derived>
8589*67e74705SXin Li ExprResult
TransformMemberExpr(MemberExpr * E)8590*67e74705SXin Li TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
8591*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
8592*67e74705SXin Li   if (Base.isInvalid())
8593*67e74705SXin Li     return ExprError();
8594*67e74705SXin Li 
8595*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
8596*67e74705SXin Li   if (E->hasQualifier()) {
8597*67e74705SXin Li     QualifierLoc
8598*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8599*67e74705SXin Li 
8600*67e74705SXin Li     if (!QualifierLoc)
8601*67e74705SXin Li       return ExprError();
8602*67e74705SXin Li   }
8603*67e74705SXin Li   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8604*67e74705SXin Li 
8605*67e74705SXin Li   ValueDecl *Member
8606*67e74705SXin Li     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
8607*67e74705SXin Li                                                          E->getMemberDecl()));
8608*67e74705SXin Li   if (!Member)
8609*67e74705SXin Li     return ExprError();
8610*67e74705SXin Li 
8611*67e74705SXin Li   NamedDecl *FoundDecl = E->getFoundDecl();
8612*67e74705SXin Li   if (FoundDecl == E->getMemberDecl()) {
8613*67e74705SXin Li     FoundDecl = Member;
8614*67e74705SXin Li   } else {
8615*67e74705SXin Li     FoundDecl = cast_or_null<NamedDecl>(
8616*67e74705SXin Li                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
8617*67e74705SXin Li     if (!FoundDecl)
8618*67e74705SXin Li       return ExprError();
8619*67e74705SXin Li   }
8620*67e74705SXin Li 
8621*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8622*67e74705SXin Li       Base.get() == E->getBase() &&
8623*67e74705SXin Li       QualifierLoc == E->getQualifierLoc() &&
8624*67e74705SXin Li       Member == E->getMemberDecl() &&
8625*67e74705SXin Li       FoundDecl == E->getFoundDecl() &&
8626*67e74705SXin Li       !E->hasExplicitTemplateArgs()) {
8627*67e74705SXin Li 
8628*67e74705SXin Li     // Mark it referenced in the new context regardless.
8629*67e74705SXin Li     // FIXME: this is a bit instantiation-specific.
8630*67e74705SXin Li     SemaRef.MarkMemberReferenced(E);
8631*67e74705SXin Li 
8632*67e74705SXin Li     return E;
8633*67e74705SXin Li   }
8634*67e74705SXin Li 
8635*67e74705SXin Li   TemplateArgumentListInfo TransArgs;
8636*67e74705SXin Li   if (E->hasExplicitTemplateArgs()) {
8637*67e74705SXin Li     TransArgs.setLAngleLoc(E->getLAngleLoc());
8638*67e74705SXin Li     TransArgs.setRAngleLoc(E->getRAngleLoc());
8639*67e74705SXin Li     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8640*67e74705SXin Li                                                 E->getNumTemplateArgs(),
8641*67e74705SXin Li                                                 TransArgs))
8642*67e74705SXin Li       return ExprError();
8643*67e74705SXin Li   }
8644*67e74705SXin Li 
8645*67e74705SXin Li   // FIXME: Bogus source location for the operator
8646*67e74705SXin Li   SourceLocation FakeOperatorLoc =
8647*67e74705SXin Li       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
8648*67e74705SXin Li 
8649*67e74705SXin Li   // FIXME: to do this check properly, we will need to preserve the
8650*67e74705SXin Li   // first-qualifier-in-scope here, just in case we had a dependent
8651*67e74705SXin Li   // base (and therefore couldn't do the check) and a
8652*67e74705SXin Li   // nested-name-qualifier (and therefore could do the lookup).
8653*67e74705SXin Li   NamedDecl *FirstQualifierInScope = nullptr;
8654*67e74705SXin Li 
8655*67e74705SXin Li   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
8656*67e74705SXin Li                                         E->isArrow(),
8657*67e74705SXin Li                                         QualifierLoc,
8658*67e74705SXin Li                                         TemplateKWLoc,
8659*67e74705SXin Li                                         E->getMemberNameInfo(),
8660*67e74705SXin Li                                         Member,
8661*67e74705SXin Li                                         FoundDecl,
8662*67e74705SXin Li                                         (E->hasExplicitTemplateArgs()
8663*67e74705SXin Li                                            ? &TransArgs : nullptr),
8664*67e74705SXin Li                                         FirstQualifierInScope);
8665*67e74705SXin Li }
8666*67e74705SXin Li 
8667*67e74705SXin Li template<typename Derived>
8668*67e74705SXin Li ExprResult
TransformBinaryOperator(BinaryOperator * E)8669*67e74705SXin Li TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
8670*67e74705SXin Li   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8671*67e74705SXin Li   if (LHS.isInvalid())
8672*67e74705SXin Li     return ExprError();
8673*67e74705SXin Li 
8674*67e74705SXin Li   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8675*67e74705SXin Li   if (RHS.isInvalid())
8676*67e74705SXin Li     return ExprError();
8677*67e74705SXin Li 
8678*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8679*67e74705SXin Li       LHS.get() == E->getLHS() &&
8680*67e74705SXin Li       RHS.get() == E->getRHS())
8681*67e74705SXin Li     return E;
8682*67e74705SXin Li 
8683*67e74705SXin Li   Sema::FPContractStateRAII FPContractState(getSema());
8684*67e74705SXin Li   getSema().FPFeatures.fp_contract = E->isFPContractable();
8685*67e74705SXin Li 
8686*67e74705SXin Li   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
8687*67e74705SXin Li                                             LHS.get(), RHS.get());
8688*67e74705SXin Li }
8689*67e74705SXin Li 
8690*67e74705SXin Li template<typename Derived>
8691*67e74705SXin Li ExprResult
TransformCompoundAssignOperator(CompoundAssignOperator * E)8692*67e74705SXin Li TreeTransform<Derived>::TransformCompoundAssignOperator(
8693*67e74705SXin Li                                                       CompoundAssignOperator *E) {
8694*67e74705SXin Li   return getDerived().TransformBinaryOperator(E);
8695*67e74705SXin Li }
8696*67e74705SXin Li 
8697*67e74705SXin Li template<typename Derived>
8698*67e74705SXin Li ExprResult TreeTransform<Derived>::
TransformBinaryConditionalOperator(BinaryConditionalOperator * e)8699*67e74705SXin Li TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
8700*67e74705SXin Li   // Just rebuild the common and RHS expressions and see whether we
8701*67e74705SXin Li   // get any changes.
8702*67e74705SXin Li 
8703*67e74705SXin Li   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
8704*67e74705SXin Li   if (commonExpr.isInvalid())
8705*67e74705SXin Li     return ExprError();
8706*67e74705SXin Li 
8707*67e74705SXin Li   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
8708*67e74705SXin Li   if (rhs.isInvalid())
8709*67e74705SXin Li     return ExprError();
8710*67e74705SXin Li 
8711*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8712*67e74705SXin Li       commonExpr.get() == e->getCommon() &&
8713*67e74705SXin Li       rhs.get() == e->getFalseExpr())
8714*67e74705SXin Li     return e;
8715*67e74705SXin Li 
8716*67e74705SXin Li   return getDerived().RebuildConditionalOperator(commonExpr.get(),
8717*67e74705SXin Li                                                  e->getQuestionLoc(),
8718*67e74705SXin Li                                                  nullptr,
8719*67e74705SXin Li                                                  e->getColonLoc(),
8720*67e74705SXin Li                                                  rhs.get());
8721*67e74705SXin Li }
8722*67e74705SXin Li 
8723*67e74705SXin Li template<typename Derived>
8724*67e74705SXin Li ExprResult
TransformConditionalOperator(ConditionalOperator * E)8725*67e74705SXin Li TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
8726*67e74705SXin Li   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8727*67e74705SXin Li   if (Cond.isInvalid())
8728*67e74705SXin Li     return ExprError();
8729*67e74705SXin Li 
8730*67e74705SXin Li   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8731*67e74705SXin Li   if (LHS.isInvalid())
8732*67e74705SXin Li     return ExprError();
8733*67e74705SXin Li 
8734*67e74705SXin Li   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8735*67e74705SXin Li   if (RHS.isInvalid())
8736*67e74705SXin Li     return ExprError();
8737*67e74705SXin Li 
8738*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8739*67e74705SXin Li       Cond.get() == E->getCond() &&
8740*67e74705SXin Li       LHS.get() == E->getLHS() &&
8741*67e74705SXin Li       RHS.get() == E->getRHS())
8742*67e74705SXin Li     return E;
8743*67e74705SXin Li 
8744*67e74705SXin Li   return getDerived().RebuildConditionalOperator(Cond.get(),
8745*67e74705SXin Li                                                  E->getQuestionLoc(),
8746*67e74705SXin Li                                                  LHS.get(),
8747*67e74705SXin Li                                                  E->getColonLoc(),
8748*67e74705SXin Li                                                  RHS.get());
8749*67e74705SXin Li }
8750*67e74705SXin Li 
8751*67e74705SXin Li template<typename Derived>
8752*67e74705SXin Li ExprResult
TransformImplicitCastExpr(ImplicitCastExpr * E)8753*67e74705SXin Li TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
8754*67e74705SXin Li   // Implicit casts are eliminated during transformation, since they
8755*67e74705SXin Li   // will be recomputed by semantic analysis after transformation.
8756*67e74705SXin Li   return getDerived().TransformExpr(E->getSubExprAsWritten());
8757*67e74705SXin Li }
8758*67e74705SXin Li 
8759*67e74705SXin Li template<typename Derived>
8760*67e74705SXin Li ExprResult
TransformCStyleCastExpr(CStyleCastExpr * E)8761*67e74705SXin Li TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
8762*67e74705SXin Li   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8763*67e74705SXin Li   if (!Type)
8764*67e74705SXin Li     return ExprError();
8765*67e74705SXin Li 
8766*67e74705SXin Li   ExprResult SubExpr
8767*67e74705SXin Li     = getDerived().TransformExpr(E->getSubExprAsWritten());
8768*67e74705SXin Li   if (SubExpr.isInvalid())
8769*67e74705SXin Li     return ExprError();
8770*67e74705SXin Li 
8771*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8772*67e74705SXin Li       Type == E->getTypeInfoAsWritten() &&
8773*67e74705SXin Li       SubExpr.get() == E->getSubExpr())
8774*67e74705SXin Li     return E;
8775*67e74705SXin Li 
8776*67e74705SXin Li   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
8777*67e74705SXin Li                                             Type,
8778*67e74705SXin Li                                             E->getRParenLoc(),
8779*67e74705SXin Li                                             SubExpr.get());
8780*67e74705SXin Li }
8781*67e74705SXin Li 
8782*67e74705SXin Li template<typename Derived>
8783*67e74705SXin Li ExprResult
TransformCompoundLiteralExpr(CompoundLiteralExpr * E)8784*67e74705SXin Li TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
8785*67e74705SXin Li   TypeSourceInfo *OldT = E->getTypeSourceInfo();
8786*67e74705SXin Li   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
8787*67e74705SXin Li   if (!NewT)
8788*67e74705SXin Li     return ExprError();
8789*67e74705SXin Li 
8790*67e74705SXin Li   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
8791*67e74705SXin Li   if (Init.isInvalid())
8792*67e74705SXin Li     return ExprError();
8793*67e74705SXin Li 
8794*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8795*67e74705SXin Li       OldT == NewT &&
8796*67e74705SXin Li       Init.get() == E->getInitializer())
8797*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
8798*67e74705SXin Li 
8799*67e74705SXin Li   // Note: the expression type doesn't necessarily match the
8800*67e74705SXin Li   // type-as-written, but that's okay, because it should always be
8801*67e74705SXin Li   // derivable from the initializer.
8802*67e74705SXin Li 
8803*67e74705SXin Li   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
8804*67e74705SXin Li                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
8805*67e74705SXin Li                                                  Init.get());
8806*67e74705SXin Li }
8807*67e74705SXin Li 
8808*67e74705SXin Li template<typename Derived>
8809*67e74705SXin Li ExprResult
TransformExtVectorElementExpr(ExtVectorElementExpr * E)8810*67e74705SXin Li TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
8811*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
8812*67e74705SXin Li   if (Base.isInvalid())
8813*67e74705SXin Li     return ExprError();
8814*67e74705SXin Li 
8815*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8816*67e74705SXin Li       Base.get() == E->getBase())
8817*67e74705SXin Li     return E;
8818*67e74705SXin Li 
8819*67e74705SXin Li   // FIXME: Bad source location
8820*67e74705SXin Li   SourceLocation FakeOperatorLoc =
8821*67e74705SXin Li       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
8822*67e74705SXin Li   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
8823*67e74705SXin Li                                                   E->getAccessorLoc(),
8824*67e74705SXin Li                                                   E->getAccessor());
8825*67e74705SXin Li }
8826*67e74705SXin Li 
8827*67e74705SXin Li template<typename Derived>
8828*67e74705SXin Li ExprResult
TransformInitListExpr(InitListExpr * E)8829*67e74705SXin Li TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
8830*67e74705SXin Li   if (InitListExpr *Syntactic = E->getSyntacticForm())
8831*67e74705SXin Li     E = Syntactic;
8832*67e74705SXin Li 
8833*67e74705SXin Li   bool InitChanged = false;
8834*67e74705SXin Li 
8835*67e74705SXin Li   SmallVector<Expr*, 4> Inits;
8836*67e74705SXin Li   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
8837*67e74705SXin Li                                   Inits, &InitChanged))
8838*67e74705SXin Li     return ExprError();
8839*67e74705SXin Li 
8840*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !InitChanged) {
8841*67e74705SXin Li     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
8842*67e74705SXin Li     // in some cases. We can't reuse it in general, because the syntactic and
8843*67e74705SXin Li     // semantic forms are linked, and we can't know that semantic form will
8844*67e74705SXin Li     // match even if the syntactic form does.
8845*67e74705SXin Li   }
8846*67e74705SXin Li 
8847*67e74705SXin Li   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
8848*67e74705SXin Li                                       E->getRBraceLoc(), E->getType());
8849*67e74705SXin Li }
8850*67e74705SXin Li 
8851*67e74705SXin Li template<typename Derived>
8852*67e74705SXin Li ExprResult
TransformDesignatedInitExpr(DesignatedInitExpr * E)8853*67e74705SXin Li TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
8854*67e74705SXin Li   Designation Desig;
8855*67e74705SXin Li 
8856*67e74705SXin Li   // transform the initializer value
8857*67e74705SXin Li   ExprResult Init = getDerived().TransformExpr(E->getInit());
8858*67e74705SXin Li   if (Init.isInvalid())
8859*67e74705SXin Li     return ExprError();
8860*67e74705SXin Li 
8861*67e74705SXin Li   // transform the designators.
8862*67e74705SXin Li   SmallVector<Expr*, 4> ArrayExprs;
8863*67e74705SXin Li   bool ExprChanged = false;
8864*67e74705SXin Li   for (const DesignatedInitExpr::Designator &D : E->designators()) {
8865*67e74705SXin Li     if (D.isFieldDesignator()) {
8866*67e74705SXin Li       Desig.AddDesignator(Designator::getField(D.getFieldName(),
8867*67e74705SXin Li                                                D.getDotLoc(),
8868*67e74705SXin Li                                                D.getFieldLoc()));
8869*67e74705SXin Li       continue;
8870*67e74705SXin Li     }
8871*67e74705SXin Li 
8872*67e74705SXin Li     if (D.isArrayDesignator()) {
8873*67e74705SXin Li       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
8874*67e74705SXin Li       if (Index.isInvalid())
8875*67e74705SXin Li         return ExprError();
8876*67e74705SXin Li 
8877*67e74705SXin Li       Desig.AddDesignator(
8878*67e74705SXin Li           Designator::getArray(Index.get(), D.getLBracketLoc()));
8879*67e74705SXin Li 
8880*67e74705SXin Li       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
8881*67e74705SXin Li       ArrayExprs.push_back(Index.get());
8882*67e74705SXin Li       continue;
8883*67e74705SXin Li     }
8884*67e74705SXin Li 
8885*67e74705SXin Li     assert(D.isArrayRangeDesignator() && "New kind of designator?");
8886*67e74705SXin Li     ExprResult Start
8887*67e74705SXin Li       = getDerived().TransformExpr(E->getArrayRangeStart(D));
8888*67e74705SXin Li     if (Start.isInvalid())
8889*67e74705SXin Li       return ExprError();
8890*67e74705SXin Li 
8891*67e74705SXin Li     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
8892*67e74705SXin Li     if (End.isInvalid())
8893*67e74705SXin Li       return ExprError();
8894*67e74705SXin Li 
8895*67e74705SXin Li     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
8896*67e74705SXin Li                                                   End.get(),
8897*67e74705SXin Li                                                   D.getLBracketLoc(),
8898*67e74705SXin Li                                                   D.getEllipsisLoc()));
8899*67e74705SXin Li 
8900*67e74705SXin Li     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
8901*67e74705SXin Li                   End.get() != E->getArrayRangeEnd(D);
8902*67e74705SXin Li 
8903*67e74705SXin Li     ArrayExprs.push_back(Start.get());
8904*67e74705SXin Li     ArrayExprs.push_back(End.get());
8905*67e74705SXin Li   }
8906*67e74705SXin Li 
8907*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8908*67e74705SXin Li       Init.get() == E->getInit() &&
8909*67e74705SXin Li       !ExprChanged)
8910*67e74705SXin Li     return E;
8911*67e74705SXin Li 
8912*67e74705SXin Li   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
8913*67e74705SXin Li                                                 E->getEqualOrColonLoc(),
8914*67e74705SXin Li                                                 E->usesGNUSyntax(), Init.get());
8915*67e74705SXin Li }
8916*67e74705SXin Li 
8917*67e74705SXin Li // Seems that if TransformInitListExpr() only works on the syntactic form of an
8918*67e74705SXin Li // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
8919*67e74705SXin Li template<typename Derived>
8920*67e74705SXin Li ExprResult
TransformDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)8921*67e74705SXin Li TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
8922*67e74705SXin Li     DesignatedInitUpdateExpr *E) {
8923*67e74705SXin Li   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
8924*67e74705SXin Li                    "initializer");
8925*67e74705SXin Li   return ExprError();
8926*67e74705SXin Li }
8927*67e74705SXin Li 
8928*67e74705SXin Li template<typename Derived>
8929*67e74705SXin Li ExprResult
TransformNoInitExpr(NoInitExpr * E)8930*67e74705SXin Li TreeTransform<Derived>::TransformNoInitExpr(
8931*67e74705SXin Li     NoInitExpr *E) {
8932*67e74705SXin Li   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
8933*67e74705SXin Li   return ExprError();
8934*67e74705SXin Li }
8935*67e74705SXin Li 
8936*67e74705SXin Li template<typename Derived>
8937*67e74705SXin Li ExprResult
TransformImplicitValueInitExpr(ImplicitValueInitExpr * E)8938*67e74705SXin Li TreeTransform<Derived>::TransformImplicitValueInitExpr(
8939*67e74705SXin Li                                                      ImplicitValueInitExpr *E) {
8940*67e74705SXin Li   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
8941*67e74705SXin Li 
8942*67e74705SXin Li   // FIXME: Will we ever have proper type location here? Will we actually
8943*67e74705SXin Li   // need to transform the type?
8944*67e74705SXin Li   QualType T = getDerived().TransformType(E->getType());
8945*67e74705SXin Li   if (T.isNull())
8946*67e74705SXin Li     return ExprError();
8947*67e74705SXin Li 
8948*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8949*67e74705SXin Li       T == E->getType())
8950*67e74705SXin Li     return E;
8951*67e74705SXin Li 
8952*67e74705SXin Li   return getDerived().RebuildImplicitValueInitExpr(T);
8953*67e74705SXin Li }
8954*67e74705SXin Li 
8955*67e74705SXin Li template<typename Derived>
8956*67e74705SXin Li ExprResult
TransformVAArgExpr(VAArgExpr * E)8957*67e74705SXin Li TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
8958*67e74705SXin Li   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
8959*67e74705SXin Li   if (!TInfo)
8960*67e74705SXin Li     return ExprError();
8961*67e74705SXin Li 
8962*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8963*67e74705SXin Li   if (SubExpr.isInvalid())
8964*67e74705SXin Li     return ExprError();
8965*67e74705SXin Li 
8966*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
8967*67e74705SXin Li       TInfo == E->getWrittenTypeInfo() &&
8968*67e74705SXin Li       SubExpr.get() == E->getSubExpr())
8969*67e74705SXin Li     return E;
8970*67e74705SXin Li 
8971*67e74705SXin Li   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
8972*67e74705SXin Li                                        TInfo, E->getRParenLoc());
8973*67e74705SXin Li }
8974*67e74705SXin Li 
8975*67e74705SXin Li template<typename Derived>
8976*67e74705SXin Li ExprResult
TransformParenListExpr(ParenListExpr * E)8977*67e74705SXin Li TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
8978*67e74705SXin Li   bool ArgumentChanged = false;
8979*67e74705SXin Li   SmallVector<Expr*, 4> Inits;
8980*67e74705SXin Li   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
8981*67e74705SXin Li                      &ArgumentChanged))
8982*67e74705SXin Li     return ExprError();
8983*67e74705SXin Li 
8984*67e74705SXin Li   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
8985*67e74705SXin Li                                            Inits,
8986*67e74705SXin Li                                            E->getRParenLoc());
8987*67e74705SXin Li }
8988*67e74705SXin Li 
8989*67e74705SXin Li /// \brief Transform an address-of-label expression.
8990*67e74705SXin Li ///
8991*67e74705SXin Li /// By default, the transformation of an address-of-label expression always
8992*67e74705SXin Li /// rebuilds the expression, so that the label identifier can be resolved to
8993*67e74705SXin Li /// the corresponding label statement by semantic analysis.
8994*67e74705SXin Li template<typename Derived>
8995*67e74705SXin Li ExprResult
TransformAddrLabelExpr(AddrLabelExpr * E)8996*67e74705SXin Li TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
8997*67e74705SXin Li   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
8998*67e74705SXin Li                                         E->getLabel());
8999*67e74705SXin Li   if (!LD)
9000*67e74705SXin Li     return ExprError();
9001*67e74705SXin Li 
9002*67e74705SXin Li   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9003*67e74705SXin Li                                            cast<LabelDecl>(LD));
9004*67e74705SXin Li }
9005*67e74705SXin Li 
9006*67e74705SXin Li template<typename Derived>
9007*67e74705SXin Li ExprResult
TransformStmtExpr(StmtExpr * E)9008*67e74705SXin Li TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9009*67e74705SXin Li   SemaRef.ActOnStartStmtExpr();
9010*67e74705SXin Li   StmtResult SubStmt
9011*67e74705SXin Li     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9012*67e74705SXin Li   if (SubStmt.isInvalid()) {
9013*67e74705SXin Li     SemaRef.ActOnStmtExprError();
9014*67e74705SXin Li     return ExprError();
9015*67e74705SXin Li   }
9016*67e74705SXin Li 
9017*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9018*67e74705SXin Li       SubStmt.get() == E->getSubStmt()) {
9019*67e74705SXin Li     // Calling this an 'error' is unintuitive, but it does the right thing.
9020*67e74705SXin Li     SemaRef.ActOnStmtExprError();
9021*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
9022*67e74705SXin Li   }
9023*67e74705SXin Li 
9024*67e74705SXin Li   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9025*67e74705SXin Li                                       SubStmt.get(),
9026*67e74705SXin Li                                       E->getRParenLoc());
9027*67e74705SXin Li }
9028*67e74705SXin Li 
9029*67e74705SXin Li template<typename Derived>
9030*67e74705SXin Li ExprResult
TransformChooseExpr(ChooseExpr * E)9031*67e74705SXin Li TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9032*67e74705SXin Li   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9033*67e74705SXin Li   if (Cond.isInvalid())
9034*67e74705SXin Li     return ExprError();
9035*67e74705SXin Li 
9036*67e74705SXin Li   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9037*67e74705SXin Li   if (LHS.isInvalid())
9038*67e74705SXin Li     return ExprError();
9039*67e74705SXin Li 
9040*67e74705SXin Li   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9041*67e74705SXin Li   if (RHS.isInvalid())
9042*67e74705SXin Li     return ExprError();
9043*67e74705SXin Li 
9044*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9045*67e74705SXin Li       Cond.get() == E->getCond() &&
9046*67e74705SXin Li       LHS.get() == E->getLHS() &&
9047*67e74705SXin Li       RHS.get() == E->getRHS())
9048*67e74705SXin Li     return E;
9049*67e74705SXin Li 
9050*67e74705SXin Li   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9051*67e74705SXin Li                                         Cond.get(), LHS.get(), RHS.get(),
9052*67e74705SXin Li                                         E->getRParenLoc());
9053*67e74705SXin Li }
9054*67e74705SXin Li 
9055*67e74705SXin Li template<typename Derived>
9056*67e74705SXin Li ExprResult
TransformGNUNullExpr(GNUNullExpr * E)9057*67e74705SXin Li TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9058*67e74705SXin Li   return E;
9059*67e74705SXin Li }
9060*67e74705SXin Li 
9061*67e74705SXin Li template<typename Derived>
9062*67e74705SXin Li ExprResult
TransformCXXOperatorCallExpr(CXXOperatorCallExpr * E)9063*67e74705SXin Li TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9064*67e74705SXin Li   switch (E->getOperator()) {
9065*67e74705SXin Li   case OO_New:
9066*67e74705SXin Li   case OO_Delete:
9067*67e74705SXin Li   case OO_Array_New:
9068*67e74705SXin Li   case OO_Array_Delete:
9069*67e74705SXin Li     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9070*67e74705SXin Li 
9071*67e74705SXin Li   case OO_Call: {
9072*67e74705SXin Li     // This is a call to an object's operator().
9073*67e74705SXin Li     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9074*67e74705SXin Li 
9075*67e74705SXin Li     // Transform the object itself.
9076*67e74705SXin Li     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9077*67e74705SXin Li     if (Object.isInvalid())
9078*67e74705SXin Li       return ExprError();
9079*67e74705SXin Li 
9080*67e74705SXin Li     // FIXME: Poor location information
9081*67e74705SXin Li     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9082*67e74705SXin Li         static_cast<Expr *>(Object.get())->getLocEnd());
9083*67e74705SXin Li 
9084*67e74705SXin Li     // Transform the call arguments.
9085*67e74705SXin Li     SmallVector<Expr*, 8> Args;
9086*67e74705SXin Li     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9087*67e74705SXin Li                                     Args))
9088*67e74705SXin Li       return ExprError();
9089*67e74705SXin Li 
9090*67e74705SXin Li     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9091*67e74705SXin Li                                         Args,
9092*67e74705SXin Li                                         E->getLocEnd());
9093*67e74705SXin Li   }
9094*67e74705SXin Li 
9095*67e74705SXin Li #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9096*67e74705SXin Li   case OO_##Name:
9097*67e74705SXin Li #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9098*67e74705SXin Li #include "clang/Basic/OperatorKinds.def"
9099*67e74705SXin Li   case OO_Subscript:
9100*67e74705SXin Li     // Handled below.
9101*67e74705SXin Li     break;
9102*67e74705SXin Li 
9103*67e74705SXin Li   case OO_Conditional:
9104*67e74705SXin Li     llvm_unreachable("conditional operator is not actually overloadable");
9105*67e74705SXin Li 
9106*67e74705SXin Li   case OO_None:
9107*67e74705SXin Li   case NUM_OVERLOADED_OPERATORS:
9108*67e74705SXin Li     llvm_unreachable("not an overloaded operator?");
9109*67e74705SXin Li   }
9110*67e74705SXin Li 
9111*67e74705SXin Li   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9112*67e74705SXin Li   if (Callee.isInvalid())
9113*67e74705SXin Li     return ExprError();
9114*67e74705SXin Li 
9115*67e74705SXin Li   ExprResult First;
9116*67e74705SXin Li   if (E->getOperator() == OO_Amp)
9117*67e74705SXin Li     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9118*67e74705SXin Li   else
9119*67e74705SXin Li     First = getDerived().TransformExpr(E->getArg(0));
9120*67e74705SXin Li   if (First.isInvalid())
9121*67e74705SXin Li     return ExprError();
9122*67e74705SXin Li 
9123*67e74705SXin Li   ExprResult Second;
9124*67e74705SXin Li   if (E->getNumArgs() == 2) {
9125*67e74705SXin Li     Second = getDerived().TransformExpr(E->getArg(1));
9126*67e74705SXin Li     if (Second.isInvalid())
9127*67e74705SXin Li       return ExprError();
9128*67e74705SXin Li   }
9129*67e74705SXin Li 
9130*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9131*67e74705SXin Li       Callee.get() == E->getCallee() &&
9132*67e74705SXin Li       First.get() == E->getArg(0) &&
9133*67e74705SXin Li       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9134*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
9135*67e74705SXin Li 
9136*67e74705SXin Li   Sema::FPContractStateRAII FPContractState(getSema());
9137*67e74705SXin Li   getSema().FPFeatures.fp_contract = E->isFPContractable();
9138*67e74705SXin Li 
9139*67e74705SXin Li   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9140*67e74705SXin Li                                                  E->getOperatorLoc(),
9141*67e74705SXin Li                                                  Callee.get(),
9142*67e74705SXin Li                                                  First.get(),
9143*67e74705SXin Li                                                  Second.get());
9144*67e74705SXin Li }
9145*67e74705SXin Li 
9146*67e74705SXin Li template<typename Derived>
9147*67e74705SXin Li ExprResult
TransformCXXMemberCallExpr(CXXMemberCallExpr * E)9148*67e74705SXin Li TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9149*67e74705SXin Li   return getDerived().TransformCallExpr(E);
9150*67e74705SXin Li }
9151*67e74705SXin Li 
9152*67e74705SXin Li template<typename Derived>
9153*67e74705SXin Li ExprResult
TransformCUDAKernelCallExpr(CUDAKernelCallExpr * E)9154*67e74705SXin Li TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9155*67e74705SXin Li   // Transform the callee.
9156*67e74705SXin Li   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9157*67e74705SXin Li   if (Callee.isInvalid())
9158*67e74705SXin Li     return ExprError();
9159*67e74705SXin Li 
9160*67e74705SXin Li   // Transform exec config.
9161*67e74705SXin Li   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9162*67e74705SXin Li   if (EC.isInvalid())
9163*67e74705SXin Li     return ExprError();
9164*67e74705SXin Li 
9165*67e74705SXin Li   // Transform arguments.
9166*67e74705SXin Li   bool ArgChanged = false;
9167*67e74705SXin Li   SmallVector<Expr*, 8> Args;
9168*67e74705SXin Li   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9169*67e74705SXin Li                                   &ArgChanged))
9170*67e74705SXin Li     return ExprError();
9171*67e74705SXin Li 
9172*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9173*67e74705SXin Li       Callee.get() == E->getCallee() &&
9174*67e74705SXin Li       !ArgChanged)
9175*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
9176*67e74705SXin Li 
9177*67e74705SXin Li   // FIXME: Wrong source location information for the '('.
9178*67e74705SXin Li   SourceLocation FakeLParenLoc
9179*67e74705SXin Li     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9180*67e74705SXin Li   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9181*67e74705SXin Li                                       Args,
9182*67e74705SXin Li                                       E->getRParenLoc(), EC.get());
9183*67e74705SXin Li }
9184*67e74705SXin Li 
9185*67e74705SXin Li template<typename Derived>
9186*67e74705SXin Li ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr * E)9187*67e74705SXin Li TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9188*67e74705SXin Li   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9189*67e74705SXin Li   if (!Type)
9190*67e74705SXin Li     return ExprError();
9191*67e74705SXin Li 
9192*67e74705SXin Li   ExprResult SubExpr
9193*67e74705SXin Li     = getDerived().TransformExpr(E->getSubExprAsWritten());
9194*67e74705SXin Li   if (SubExpr.isInvalid())
9195*67e74705SXin Li     return ExprError();
9196*67e74705SXin Li 
9197*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9198*67e74705SXin Li       Type == E->getTypeInfoAsWritten() &&
9199*67e74705SXin Li       SubExpr.get() == E->getSubExpr())
9200*67e74705SXin Li     return E;
9201*67e74705SXin Li   return getDerived().RebuildCXXNamedCastExpr(
9202*67e74705SXin Li       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9203*67e74705SXin Li       Type, E->getAngleBrackets().getEnd(),
9204*67e74705SXin Li       // FIXME. this should be '(' location
9205*67e74705SXin Li       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9206*67e74705SXin Li }
9207*67e74705SXin Li 
9208*67e74705SXin Li template<typename Derived>
9209*67e74705SXin Li ExprResult
TransformCXXStaticCastExpr(CXXStaticCastExpr * E)9210*67e74705SXin Li TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9211*67e74705SXin Li   return getDerived().TransformCXXNamedCastExpr(E);
9212*67e74705SXin Li }
9213*67e74705SXin Li 
9214*67e74705SXin Li template<typename Derived>
9215*67e74705SXin Li ExprResult
TransformCXXDynamicCastExpr(CXXDynamicCastExpr * E)9216*67e74705SXin Li TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9217*67e74705SXin Li   return getDerived().TransformCXXNamedCastExpr(E);
9218*67e74705SXin Li }
9219*67e74705SXin Li 
9220*67e74705SXin Li template<typename Derived>
9221*67e74705SXin Li ExprResult
TransformCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)9222*67e74705SXin Li TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9223*67e74705SXin Li                                                       CXXReinterpretCastExpr *E) {
9224*67e74705SXin Li   return getDerived().TransformCXXNamedCastExpr(E);
9225*67e74705SXin Li }
9226*67e74705SXin Li 
9227*67e74705SXin Li template<typename Derived>
9228*67e74705SXin Li ExprResult
TransformCXXConstCastExpr(CXXConstCastExpr * E)9229*67e74705SXin Li TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9230*67e74705SXin Li   return getDerived().TransformCXXNamedCastExpr(E);
9231*67e74705SXin Li }
9232*67e74705SXin Li 
9233*67e74705SXin Li template<typename Derived>
9234*67e74705SXin Li ExprResult
TransformCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)9235*67e74705SXin Li TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9236*67e74705SXin Li                                                      CXXFunctionalCastExpr *E) {
9237*67e74705SXin Li   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9238*67e74705SXin Li   if (!Type)
9239*67e74705SXin Li     return ExprError();
9240*67e74705SXin Li 
9241*67e74705SXin Li   ExprResult SubExpr
9242*67e74705SXin Li     = getDerived().TransformExpr(E->getSubExprAsWritten());
9243*67e74705SXin Li   if (SubExpr.isInvalid())
9244*67e74705SXin Li     return ExprError();
9245*67e74705SXin Li 
9246*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9247*67e74705SXin Li       Type == E->getTypeInfoAsWritten() &&
9248*67e74705SXin Li       SubExpr.get() == E->getSubExpr())
9249*67e74705SXin Li     return E;
9250*67e74705SXin Li 
9251*67e74705SXin Li   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9252*67e74705SXin Li                                                    E->getLParenLoc(),
9253*67e74705SXin Li                                                    SubExpr.get(),
9254*67e74705SXin Li                                                    E->getRParenLoc());
9255*67e74705SXin Li }
9256*67e74705SXin Li 
9257*67e74705SXin Li template<typename Derived>
9258*67e74705SXin Li ExprResult
TransformCXXTypeidExpr(CXXTypeidExpr * E)9259*67e74705SXin Li TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9260*67e74705SXin Li   if (E->isTypeOperand()) {
9261*67e74705SXin Li     TypeSourceInfo *TInfo
9262*67e74705SXin Li       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9263*67e74705SXin Li     if (!TInfo)
9264*67e74705SXin Li       return ExprError();
9265*67e74705SXin Li 
9266*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
9267*67e74705SXin Li         TInfo == E->getTypeOperandSourceInfo())
9268*67e74705SXin Li       return E;
9269*67e74705SXin Li 
9270*67e74705SXin Li     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9271*67e74705SXin Li                                              E->getLocStart(),
9272*67e74705SXin Li                                              TInfo,
9273*67e74705SXin Li                                              E->getLocEnd());
9274*67e74705SXin Li   }
9275*67e74705SXin Li 
9276*67e74705SXin Li   // We don't know whether the subexpression is potentially evaluated until
9277*67e74705SXin Li   // after we perform semantic analysis.  We speculatively assume it is
9278*67e74705SXin Li   // unevaluated; it will get fixed later if the subexpression is in fact
9279*67e74705SXin Li   // potentially evaluated.
9280*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
9281*67e74705SXin Li                                                Sema::ReuseLambdaContextDecl);
9282*67e74705SXin Li 
9283*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9284*67e74705SXin Li   if (SubExpr.isInvalid())
9285*67e74705SXin Li     return ExprError();
9286*67e74705SXin Li 
9287*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9288*67e74705SXin Li       SubExpr.get() == E->getExprOperand())
9289*67e74705SXin Li     return E;
9290*67e74705SXin Li 
9291*67e74705SXin Li   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9292*67e74705SXin Li                                            E->getLocStart(),
9293*67e74705SXin Li                                            SubExpr.get(),
9294*67e74705SXin Li                                            E->getLocEnd());
9295*67e74705SXin Li }
9296*67e74705SXin Li 
9297*67e74705SXin Li template<typename Derived>
9298*67e74705SXin Li ExprResult
TransformCXXUuidofExpr(CXXUuidofExpr * E)9299*67e74705SXin Li TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9300*67e74705SXin Li   if (E->isTypeOperand()) {
9301*67e74705SXin Li     TypeSourceInfo *TInfo
9302*67e74705SXin Li       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9303*67e74705SXin Li     if (!TInfo)
9304*67e74705SXin Li       return ExprError();
9305*67e74705SXin Li 
9306*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
9307*67e74705SXin Li         TInfo == E->getTypeOperandSourceInfo())
9308*67e74705SXin Li       return E;
9309*67e74705SXin Li 
9310*67e74705SXin Li     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9311*67e74705SXin Li                                              E->getLocStart(),
9312*67e74705SXin Li                                              TInfo,
9313*67e74705SXin Li                                              E->getLocEnd());
9314*67e74705SXin Li   }
9315*67e74705SXin Li 
9316*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9317*67e74705SXin Li 
9318*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9319*67e74705SXin Li   if (SubExpr.isInvalid())
9320*67e74705SXin Li     return ExprError();
9321*67e74705SXin Li 
9322*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9323*67e74705SXin Li       SubExpr.get() == E->getExprOperand())
9324*67e74705SXin Li     return E;
9325*67e74705SXin Li 
9326*67e74705SXin Li   return getDerived().RebuildCXXUuidofExpr(E->getType(),
9327*67e74705SXin Li                                            E->getLocStart(),
9328*67e74705SXin Li                                            SubExpr.get(),
9329*67e74705SXin Li                                            E->getLocEnd());
9330*67e74705SXin Li }
9331*67e74705SXin Li 
9332*67e74705SXin Li template<typename Derived>
9333*67e74705SXin Li ExprResult
TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)9334*67e74705SXin Li TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
9335*67e74705SXin Li   return E;
9336*67e74705SXin Li }
9337*67e74705SXin Li 
9338*67e74705SXin Li template<typename Derived>
9339*67e74705SXin Li ExprResult
TransformCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)9340*67e74705SXin Li TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
9341*67e74705SXin Li                                                      CXXNullPtrLiteralExpr *E) {
9342*67e74705SXin Li   return E;
9343*67e74705SXin Li }
9344*67e74705SXin Li 
9345*67e74705SXin Li template<typename Derived>
9346*67e74705SXin Li ExprResult
TransformCXXThisExpr(CXXThisExpr * E)9347*67e74705SXin Li TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
9348*67e74705SXin Li   QualType T = getSema().getCurrentThisType();
9349*67e74705SXin Li 
9350*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
9351*67e74705SXin Li     // Make sure that we capture 'this'.
9352*67e74705SXin Li     getSema().CheckCXXThisCapture(E->getLocStart());
9353*67e74705SXin Li     return E;
9354*67e74705SXin Li   }
9355*67e74705SXin Li 
9356*67e74705SXin Li   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
9357*67e74705SXin Li }
9358*67e74705SXin Li 
9359*67e74705SXin Li template<typename Derived>
9360*67e74705SXin Li ExprResult
TransformCXXThrowExpr(CXXThrowExpr * E)9361*67e74705SXin Li TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
9362*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9363*67e74705SXin Li   if (SubExpr.isInvalid())
9364*67e74705SXin Li     return ExprError();
9365*67e74705SXin Li 
9366*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9367*67e74705SXin Li       SubExpr.get() == E->getSubExpr())
9368*67e74705SXin Li     return E;
9369*67e74705SXin Li 
9370*67e74705SXin Li   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
9371*67e74705SXin Li                                           E->isThrownVariableInScope());
9372*67e74705SXin Li }
9373*67e74705SXin Li 
9374*67e74705SXin Li template<typename Derived>
9375*67e74705SXin Li ExprResult
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)9376*67e74705SXin Li TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
9377*67e74705SXin Li   ParmVarDecl *Param
9378*67e74705SXin Li     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
9379*67e74705SXin Li                                                            E->getParam()));
9380*67e74705SXin Li   if (!Param)
9381*67e74705SXin Li     return ExprError();
9382*67e74705SXin Li 
9383*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9384*67e74705SXin Li       Param == E->getParam())
9385*67e74705SXin Li     return E;
9386*67e74705SXin Li 
9387*67e74705SXin Li   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
9388*67e74705SXin Li }
9389*67e74705SXin Li 
9390*67e74705SXin Li template<typename Derived>
9391*67e74705SXin Li ExprResult
TransformCXXDefaultInitExpr(CXXDefaultInitExpr * E)9392*67e74705SXin Li TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
9393*67e74705SXin Li   FieldDecl *Field
9394*67e74705SXin Li     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
9395*67e74705SXin Li                                                          E->getField()));
9396*67e74705SXin Li   if (!Field)
9397*67e74705SXin Li     return ExprError();
9398*67e74705SXin Li 
9399*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && Field == E->getField())
9400*67e74705SXin Li     return E;
9401*67e74705SXin Li 
9402*67e74705SXin Li   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
9403*67e74705SXin Li }
9404*67e74705SXin Li 
9405*67e74705SXin Li template<typename Derived>
9406*67e74705SXin Li ExprResult
TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)9407*67e74705SXin Li TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
9408*67e74705SXin Li                                                     CXXScalarValueInitExpr *E) {
9409*67e74705SXin Li   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9410*67e74705SXin Li   if (!T)
9411*67e74705SXin Li     return ExprError();
9412*67e74705SXin Li 
9413*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9414*67e74705SXin Li       T == E->getTypeSourceInfo())
9415*67e74705SXin Li     return E;
9416*67e74705SXin Li 
9417*67e74705SXin Li   return getDerived().RebuildCXXScalarValueInitExpr(T,
9418*67e74705SXin Li                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9419*67e74705SXin Li                                                     E->getRParenLoc());
9420*67e74705SXin Li }
9421*67e74705SXin Li 
9422*67e74705SXin Li template<typename Derived>
9423*67e74705SXin Li ExprResult
TransformCXXNewExpr(CXXNewExpr * E)9424*67e74705SXin Li TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
9425*67e74705SXin Li   // Transform the type that we're allocating
9426*67e74705SXin Li   TypeSourceInfo *AllocTypeInfo
9427*67e74705SXin Li     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
9428*67e74705SXin Li   if (!AllocTypeInfo)
9429*67e74705SXin Li     return ExprError();
9430*67e74705SXin Li 
9431*67e74705SXin Li   // Transform the size of the array we're allocating (if any).
9432*67e74705SXin Li   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
9433*67e74705SXin Li   if (ArraySize.isInvalid())
9434*67e74705SXin Li     return ExprError();
9435*67e74705SXin Li 
9436*67e74705SXin Li   // Transform the placement arguments (if any).
9437*67e74705SXin Li   bool ArgumentChanged = false;
9438*67e74705SXin Li   SmallVector<Expr*, 8> PlacementArgs;
9439*67e74705SXin Li   if (getDerived().TransformExprs(E->getPlacementArgs(),
9440*67e74705SXin Li                                   E->getNumPlacementArgs(), true,
9441*67e74705SXin Li                                   PlacementArgs, &ArgumentChanged))
9442*67e74705SXin Li     return ExprError();
9443*67e74705SXin Li 
9444*67e74705SXin Li   // Transform the initializer (if any).
9445*67e74705SXin Li   Expr *OldInit = E->getInitializer();
9446*67e74705SXin Li   ExprResult NewInit;
9447*67e74705SXin Li   if (OldInit)
9448*67e74705SXin Li     NewInit = getDerived().TransformInitializer(OldInit, true);
9449*67e74705SXin Li   if (NewInit.isInvalid())
9450*67e74705SXin Li     return ExprError();
9451*67e74705SXin Li 
9452*67e74705SXin Li   // Transform new operator and delete operator.
9453*67e74705SXin Li   FunctionDecl *OperatorNew = nullptr;
9454*67e74705SXin Li   if (E->getOperatorNew()) {
9455*67e74705SXin Li     OperatorNew = cast_or_null<FunctionDecl>(
9456*67e74705SXin Li                                  getDerived().TransformDecl(E->getLocStart(),
9457*67e74705SXin Li                                                          E->getOperatorNew()));
9458*67e74705SXin Li     if (!OperatorNew)
9459*67e74705SXin Li       return ExprError();
9460*67e74705SXin Li   }
9461*67e74705SXin Li 
9462*67e74705SXin Li   FunctionDecl *OperatorDelete = nullptr;
9463*67e74705SXin Li   if (E->getOperatorDelete()) {
9464*67e74705SXin Li     OperatorDelete = cast_or_null<FunctionDecl>(
9465*67e74705SXin Li                                    getDerived().TransformDecl(E->getLocStart(),
9466*67e74705SXin Li                                                        E->getOperatorDelete()));
9467*67e74705SXin Li     if (!OperatorDelete)
9468*67e74705SXin Li       return ExprError();
9469*67e74705SXin Li   }
9470*67e74705SXin Li 
9471*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9472*67e74705SXin Li       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
9473*67e74705SXin Li       ArraySize.get() == E->getArraySize() &&
9474*67e74705SXin Li       NewInit.get() == OldInit &&
9475*67e74705SXin Li       OperatorNew == E->getOperatorNew() &&
9476*67e74705SXin Li       OperatorDelete == E->getOperatorDelete() &&
9477*67e74705SXin Li       !ArgumentChanged) {
9478*67e74705SXin Li     // Mark any declarations we need as referenced.
9479*67e74705SXin Li     // FIXME: instantiation-specific.
9480*67e74705SXin Li     if (OperatorNew)
9481*67e74705SXin Li       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
9482*67e74705SXin Li     if (OperatorDelete)
9483*67e74705SXin Li       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9484*67e74705SXin Li 
9485*67e74705SXin Li     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
9486*67e74705SXin Li       QualType ElementType
9487*67e74705SXin Li         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
9488*67e74705SXin Li       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
9489*67e74705SXin Li         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
9490*67e74705SXin Li         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
9491*67e74705SXin Li           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
9492*67e74705SXin Li         }
9493*67e74705SXin Li       }
9494*67e74705SXin Li     }
9495*67e74705SXin Li 
9496*67e74705SXin Li     return E;
9497*67e74705SXin Li   }
9498*67e74705SXin Li 
9499*67e74705SXin Li   QualType AllocType = AllocTypeInfo->getType();
9500*67e74705SXin Li   if (!ArraySize.get()) {
9501*67e74705SXin Li     // If no array size was specified, but the new expression was
9502*67e74705SXin Li     // instantiated with an array type (e.g., "new T" where T is
9503*67e74705SXin Li     // instantiated with "int[4]"), extract the outer bound from the
9504*67e74705SXin Li     // array type as our array size. We do this with constant and
9505*67e74705SXin Li     // dependently-sized array types.
9506*67e74705SXin Li     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
9507*67e74705SXin Li     if (!ArrayT) {
9508*67e74705SXin Li       // Do nothing
9509*67e74705SXin Li     } else if (const ConstantArrayType *ConsArrayT
9510*67e74705SXin Li                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
9511*67e74705SXin Li       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
9512*67e74705SXin Li                                          SemaRef.Context.getSizeType(),
9513*67e74705SXin Li                                          /*FIXME:*/ E->getLocStart());
9514*67e74705SXin Li       AllocType = ConsArrayT->getElementType();
9515*67e74705SXin Li     } else if (const DependentSizedArrayType *DepArrayT
9516*67e74705SXin Li                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
9517*67e74705SXin Li       if (DepArrayT->getSizeExpr()) {
9518*67e74705SXin Li         ArraySize = DepArrayT->getSizeExpr();
9519*67e74705SXin Li         AllocType = DepArrayT->getElementType();
9520*67e74705SXin Li       }
9521*67e74705SXin Li     }
9522*67e74705SXin Li   }
9523*67e74705SXin Li 
9524*67e74705SXin Li   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
9525*67e74705SXin Li                                         E->isGlobalNew(),
9526*67e74705SXin Li                                         /*FIXME:*/E->getLocStart(),
9527*67e74705SXin Li                                         PlacementArgs,
9528*67e74705SXin Li                                         /*FIXME:*/E->getLocStart(),
9529*67e74705SXin Li                                         E->getTypeIdParens(),
9530*67e74705SXin Li                                         AllocType,
9531*67e74705SXin Li                                         AllocTypeInfo,
9532*67e74705SXin Li                                         ArraySize.get(),
9533*67e74705SXin Li                                         E->getDirectInitRange(),
9534*67e74705SXin Li                                         NewInit.get());
9535*67e74705SXin Li }
9536*67e74705SXin Li 
9537*67e74705SXin Li template<typename Derived>
9538*67e74705SXin Li ExprResult
TransformCXXDeleteExpr(CXXDeleteExpr * E)9539*67e74705SXin Li TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
9540*67e74705SXin Li   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
9541*67e74705SXin Li   if (Operand.isInvalid())
9542*67e74705SXin Li     return ExprError();
9543*67e74705SXin Li 
9544*67e74705SXin Li   // Transform the delete operator, if known.
9545*67e74705SXin Li   FunctionDecl *OperatorDelete = nullptr;
9546*67e74705SXin Li   if (E->getOperatorDelete()) {
9547*67e74705SXin Li     OperatorDelete = cast_or_null<FunctionDecl>(
9548*67e74705SXin Li                                    getDerived().TransformDecl(E->getLocStart(),
9549*67e74705SXin Li                                                        E->getOperatorDelete()));
9550*67e74705SXin Li     if (!OperatorDelete)
9551*67e74705SXin Li       return ExprError();
9552*67e74705SXin Li   }
9553*67e74705SXin Li 
9554*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9555*67e74705SXin Li       Operand.get() == E->getArgument() &&
9556*67e74705SXin Li       OperatorDelete == E->getOperatorDelete()) {
9557*67e74705SXin Li     // Mark any declarations we need as referenced.
9558*67e74705SXin Li     // FIXME: instantiation-specific.
9559*67e74705SXin Li     if (OperatorDelete)
9560*67e74705SXin Li       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
9561*67e74705SXin Li 
9562*67e74705SXin Li     if (!E->getArgument()->isTypeDependent()) {
9563*67e74705SXin Li       QualType Destroyed = SemaRef.Context.getBaseElementType(
9564*67e74705SXin Li                                                          E->getDestroyedType());
9565*67e74705SXin Li       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
9566*67e74705SXin Li         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
9567*67e74705SXin Li         SemaRef.MarkFunctionReferenced(E->getLocStart(),
9568*67e74705SXin Li                                        SemaRef.LookupDestructor(Record));
9569*67e74705SXin Li       }
9570*67e74705SXin Li     }
9571*67e74705SXin Li 
9572*67e74705SXin Li     return E;
9573*67e74705SXin Li   }
9574*67e74705SXin Li 
9575*67e74705SXin Li   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
9576*67e74705SXin Li                                            E->isGlobalDelete(),
9577*67e74705SXin Li                                            E->isArrayForm(),
9578*67e74705SXin Li                                            Operand.get());
9579*67e74705SXin Li }
9580*67e74705SXin Li 
9581*67e74705SXin Li template<typename Derived>
9582*67e74705SXin Li ExprResult
TransformCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)9583*67e74705SXin Li TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
9584*67e74705SXin Li                                                      CXXPseudoDestructorExpr *E) {
9585*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
9586*67e74705SXin Li   if (Base.isInvalid())
9587*67e74705SXin Li     return ExprError();
9588*67e74705SXin Li 
9589*67e74705SXin Li   ParsedType ObjectTypePtr;
9590*67e74705SXin Li   bool MayBePseudoDestructor = false;
9591*67e74705SXin Li   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9592*67e74705SXin Li                                               E->getOperatorLoc(),
9593*67e74705SXin Li                                         E->isArrow()? tok::arrow : tok::period,
9594*67e74705SXin Li                                               ObjectTypePtr,
9595*67e74705SXin Li                                               MayBePseudoDestructor);
9596*67e74705SXin Li   if (Base.isInvalid())
9597*67e74705SXin Li     return ExprError();
9598*67e74705SXin Li 
9599*67e74705SXin Li   QualType ObjectType = ObjectTypePtr.get();
9600*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
9601*67e74705SXin Li   if (QualifierLoc) {
9602*67e74705SXin Li     QualifierLoc
9603*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
9604*67e74705SXin Li     if (!QualifierLoc)
9605*67e74705SXin Li       return ExprError();
9606*67e74705SXin Li   }
9607*67e74705SXin Li   CXXScopeSpec SS;
9608*67e74705SXin Li   SS.Adopt(QualifierLoc);
9609*67e74705SXin Li 
9610*67e74705SXin Li   PseudoDestructorTypeStorage Destroyed;
9611*67e74705SXin Li   if (E->getDestroyedTypeInfo()) {
9612*67e74705SXin Li     TypeSourceInfo *DestroyedTypeInfo
9613*67e74705SXin Li       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
9614*67e74705SXin Li                                                 ObjectType, nullptr, SS);
9615*67e74705SXin Li     if (!DestroyedTypeInfo)
9616*67e74705SXin Li       return ExprError();
9617*67e74705SXin Li     Destroyed = DestroyedTypeInfo;
9618*67e74705SXin Li   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
9619*67e74705SXin Li     // We aren't likely to be able to resolve the identifier down to a type
9620*67e74705SXin Li     // now anyway, so just retain the identifier.
9621*67e74705SXin Li     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
9622*67e74705SXin Li                                             E->getDestroyedTypeLoc());
9623*67e74705SXin Li   } else {
9624*67e74705SXin Li     // Look for a destructor known with the given name.
9625*67e74705SXin Li     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
9626*67e74705SXin Li                                               *E->getDestroyedTypeIdentifier(),
9627*67e74705SXin Li                                                 E->getDestroyedTypeLoc(),
9628*67e74705SXin Li                                                 /*Scope=*/nullptr,
9629*67e74705SXin Li                                                 SS, ObjectTypePtr,
9630*67e74705SXin Li                                                 false);
9631*67e74705SXin Li     if (!T)
9632*67e74705SXin Li       return ExprError();
9633*67e74705SXin Li 
9634*67e74705SXin Li     Destroyed
9635*67e74705SXin Li       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
9636*67e74705SXin Li                                                  E->getDestroyedTypeLoc());
9637*67e74705SXin Li   }
9638*67e74705SXin Li 
9639*67e74705SXin Li   TypeSourceInfo *ScopeTypeInfo = nullptr;
9640*67e74705SXin Li   if (E->getScopeTypeInfo()) {
9641*67e74705SXin Li     CXXScopeSpec EmptySS;
9642*67e74705SXin Li     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
9643*67e74705SXin Li                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
9644*67e74705SXin Li     if (!ScopeTypeInfo)
9645*67e74705SXin Li       return ExprError();
9646*67e74705SXin Li   }
9647*67e74705SXin Li 
9648*67e74705SXin Li   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
9649*67e74705SXin Li                                                      E->getOperatorLoc(),
9650*67e74705SXin Li                                                      E->isArrow(),
9651*67e74705SXin Li                                                      SS,
9652*67e74705SXin Li                                                      ScopeTypeInfo,
9653*67e74705SXin Li                                                      E->getColonColonLoc(),
9654*67e74705SXin Li                                                      E->getTildeLoc(),
9655*67e74705SXin Li                                                      Destroyed);
9656*67e74705SXin Li }
9657*67e74705SXin Li 
9658*67e74705SXin Li template<typename Derived>
9659*67e74705SXin Li ExprResult
TransformUnresolvedLookupExpr(UnresolvedLookupExpr * Old)9660*67e74705SXin Li TreeTransform<Derived>::TransformUnresolvedLookupExpr(
9661*67e74705SXin Li                                                   UnresolvedLookupExpr *Old) {
9662*67e74705SXin Li   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
9663*67e74705SXin Li                  Sema::LookupOrdinaryName);
9664*67e74705SXin Li 
9665*67e74705SXin Li   // Transform all the decls.
9666*67e74705SXin Li   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
9667*67e74705SXin Li          E = Old->decls_end(); I != E; ++I) {
9668*67e74705SXin Li     NamedDecl *InstD = static_cast<NamedDecl*>(
9669*67e74705SXin Li                                  getDerived().TransformDecl(Old->getNameLoc(),
9670*67e74705SXin Li                                                             *I));
9671*67e74705SXin Li     if (!InstD) {
9672*67e74705SXin Li       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9673*67e74705SXin Li       // This can happen because of dependent hiding.
9674*67e74705SXin Li       if (isa<UsingShadowDecl>(*I))
9675*67e74705SXin Li         continue;
9676*67e74705SXin Li       else {
9677*67e74705SXin Li         R.clear();
9678*67e74705SXin Li         return ExprError();
9679*67e74705SXin Li       }
9680*67e74705SXin Li     }
9681*67e74705SXin Li 
9682*67e74705SXin Li     // Expand using declarations.
9683*67e74705SXin Li     if (isa<UsingDecl>(InstD)) {
9684*67e74705SXin Li       UsingDecl *UD = cast<UsingDecl>(InstD);
9685*67e74705SXin Li       for (auto *I : UD->shadows())
9686*67e74705SXin Li         R.addDecl(I);
9687*67e74705SXin Li       continue;
9688*67e74705SXin Li     }
9689*67e74705SXin Li 
9690*67e74705SXin Li     R.addDecl(InstD);
9691*67e74705SXin Li   }
9692*67e74705SXin Li 
9693*67e74705SXin Li   // Resolve a kind, but don't do any further analysis.  If it's
9694*67e74705SXin Li   // ambiguous, the callee needs to deal with it.
9695*67e74705SXin Li   R.resolveKind();
9696*67e74705SXin Li 
9697*67e74705SXin Li   // Rebuild the nested-name qualifier, if present.
9698*67e74705SXin Li   CXXScopeSpec SS;
9699*67e74705SXin Li   if (Old->getQualifierLoc()) {
9700*67e74705SXin Li     NestedNameSpecifierLoc QualifierLoc
9701*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9702*67e74705SXin Li     if (!QualifierLoc)
9703*67e74705SXin Li       return ExprError();
9704*67e74705SXin Li 
9705*67e74705SXin Li     SS.Adopt(QualifierLoc);
9706*67e74705SXin Li   }
9707*67e74705SXin Li 
9708*67e74705SXin Li   if (Old->getNamingClass()) {
9709*67e74705SXin Li     CXXRecordDecl *NamingClass
9710*67e74705SXin Li       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9711*67e74705SXin Li                                                             Old->getNameLoc(),
9712*67e74705SXin Li                                                         Old->getNamingClass()));
9713*67e74705SXin Li     if (!NamingClass) {
9714*67e74705SXin Li       R.clear();
9715*67e74705SXin Li       return ExprError();
9716*67e74705SXin Li     }
9717*67e74705SXin Li 
9718*67e74705SXin Li     R.setNamingClass(NamingClass);
9719*67e74705SXin Li   }
9720*67e74705SXin Li 
9721*67e74705SXin Li   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9722*67e74705SXin Li 
9723*67e74705SXin Li   // If we have neither explicit template arguments, nor the template keyword,
9724*67e74705SXin Li   // it's a normal declaration name or member reference.
9725*67e74705SXin Li   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
9726*67e74705SXin Li     NamedDecl *D = R.getAsSingle<NamedDecl>();
9727*67e74705SXin Li     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
9728*67e74705SXin Li     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
9729*67e74705SXin Li     // give a good diagnostic.
9730*67e74705SXin Li     if (D && D->isCXXInstanceMember()) {
9731*67e74705SXin Li       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
9732*67e74705SXin Li                                                      /*TemplateArgs=*/nullptr,
9733*67e74705SXin Li                                                      /*Scope=*/nullptr);
9734*67e74705SXin Li     }
9735*67e74705SXin Li 
9736*67e74705SXin Li     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
9737*67e74705SXin Li   }
9738*67e74705SXin Li 
9739*67e74705SXin Li   // If we have template arguments, rebuild them, then rebuild the
9740*67e74705SXin Li   // templateid expression.
9741*67e74705SXin Li   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
9742*67e74705SXin Li   if (Old->hasExplicitTemplateArgs() &&
9743*67e74705SXin Li       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9744*67e74705SXin Li                                               Old->getNumTemplateArgs(),
9745*67e74705SXin Li                                               TransArgs)) {
9746*67e74705SXin Li     R.clear();
9747*67e74705SXin Li     return ExprError();
9748*67e74705SXin Li   }
9749*67e74705SXin Li 
9750*67e74705SXin Li   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
9751*67e74705SXin Li                                             Old->requiresADL(), &TransArgs);
9752*67e74705SXin Li }
9753*67e74705SXin Li 
9754*67e74705SXin Li template<typename Derived>
9755*67e74705SXin Li ExprResult
TransformTypeTraitExpr(TypeTraitExpr * E)9756*67e74705SXin Li TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
9757*67e74705SXin Li   bool ArgChanged = false;
9758*67e74705SXin Li   SmallVector<TypeSourceInfo *, 4> Args;
9759*67e74705SXin Li   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
9760*67e74705SXin Li     TypeSourceInfo *From = E->getArg(I);
9761*67e74705SXin Li     TypeLoc FromTL = From->getTypeLoc();
9762*67e74705SXin Li     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
9763*67e74705SXin Li       TypeLocBuilder TLB;
9764*67e74705SXin Li       TLB.reserve(FromTL.getFullDataSize());
9765*67e74705SXin Li       QualType To = getDerived().TransformType(TLB, FromTL);
9766*67e74705SXin Li       if (To.isNull())
9767*67e74705SXin Li         return ExprError();
9768*67e74705SXin Li 
9769*67e74705SXin Li       if (To == From->getType())
9770*67e74705SXin Li         Args.push_back(From);
9771*67e74705SXin Li       else {
9772*67e74705SXin Li         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9773*67e74705SXin Li         ArgChanged = true;
9774*67e74705SXin Li       }
9775*67e74705SXin Li       continue;
9776*67e74705SXin Li     }
9777*67e74705SXin Li 
9778*67e74705SXin Li     ArgChanged = true;
9779*67e74705SXin Li 
9780*67e74705SXin Li     // We have a pack expansion. Instantiate it.
9781*67e74705SXin Li     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
9782*67e74705SXin Li     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
9783*67e74705SXin Li     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9784*67e74705SXin Li     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
9785*67e74705SXin Li 
9786*67e74705SXin Li     // Determine whether the set of unexpanded parameter packs can and should
9787*67e74705SXin Li     // be expanded.
9788*67e74705SXin Li     bool Expand = true;
9789*67e74705SXin Li     bool RetainExpansion = false;
9790*67e74705SXin Li     Optional<unsigned> OrigNumExpansions =
9791*67e74705SXin Li         ExpansionTL.getTypePtr()->getNumExpansions();
9792*67e74705SXin Li     Optional<unsigned> NumExpansions = OrigNumExpansions;
9793*67e74705SXin Li     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
9794*67e74705SXin Li                                              PatternTL.getSourceRange(),
9795*67e74705SXin Li                                              Unexpanded,
9796*67e74705SXin Li                                              Expand, RetainExpansion,
9797*67e74705SXin Li                                              NumExpansions))
9798*67e74705SXin Li       return ExprError();
9799*67e74705SXin Li 
9800*67e74705SXin Li     if (!Expand) {
9801*67e74705SXin Li       // The transform has determined that we should perform a simple
9802*67e74705SXin Li       // transformation on the pack expansion, producing another pack
9803*67e74705SXin Li       // expansion.
9804*67e74705SXin Li       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9805*67e74705SXin Li 
9806*67e74705SXin Li       TypeLocBuilder TLB;
9807*67e74705SXin Li       TLB.reserve(From->getTypeLoc().getFullDataSize());
9808*67e74705SXin Li 
9809*67e74705SXin Li       QualType To = getDerived().TransformType(TLB, PatternTL);
9810*67e74705SXin Li       if (To.isNull())
9811*67e74705SXin Li         return ExprError();
9812*67e74705SXin Li 
9813*67e74705SXin Li       To = getDerived().RebuildPackExpansionType(To,
9814*67e74705SXin Li                                                  PatternTL.getSourceRange(),
9815*67e74705SXin Li                                                  ExpansionTL.getEllipsisLoc(),
9816*67e74705SXin Li                                                  NumExpansions);
9817*67e74705SXin Li       if (To.isNull())
9818*67e74705SXin Li         return ExprError();
9819*67e74705SXin Li 
9820*67e74705SXin Li       PackExpansionTypeLoc ToExpansionTL
9821*67e74705SXin Li         = TLB.push<PackExpansionTypeLoc>(To);
9822*67e74705SXin Li       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
9823*67e74705SXin Li       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9824*67e74705SXin Li       continue;
9825*67e74705SXin Li     }
9826*67e74705SXin Li 
9827*67e74705SXin Li     // Expand the pack expansion by substituting for each argument in the
9828*67e74705SXin Li     // pack(s).
9829*67e74705SXin Li     for (unsigned I = 0; I != *NumExpansions; ++I) {
9830*67e74705SXin Li       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
9831*67e74705SXin Li       TypeLocBuilder TLB;
9832*67e74705SXin Li       TLB.reserve(PatternTL.getFullDataSize());
9833*67e74705SXin Li       QualType To = getDerived().TransformType(TLB, PatternTL);
9834*67e74705SXin Li       if (To.isNull())
9835*67e74705SXin Li         return ExprError();
9836*67e74705SXin Li 
9837*67e74705SXin Li       if (To->containsUnexpandedParameterPack()) {
9838*67e74705SXin Li         To = getDerived().RebuildPackExpansionType(To,
9839*67e74705SXin Li                                                    PatternTL.getSourceRange(),
9840*67e74705SXin Li                                                    ExpansionTL.getEllipsisLoc(),
9841*67e74705SXin Li                                                    NumExpansions);
9842*67e74705SXin Li         if (To.isNull())
9843*67e74705SXin Li           return ExprError();
9844*67e74705SXin Li 
9845*67e74705SXin Li         PackExpansionTypeLoc ToExpansionTL
9846*67e74705SXin Li           = TLB.push<PackExpansionTypeLoc>(To);
9847*67e74705SXin Li         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
9848*67e74705SXin Li       }
9849*67e74705SXin Li 
9850*67e74705SXin Li       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9851*67e74705SXin Li     }
9852*67e74705SXin Li 
9853*67e74705SXin Li     if (!RetainExpansion)
9854*67e74705SXin Li       continue;
9855*67e74705SXin Li 
9856*67e74705SXin Li     // If we're supposed to retain a pack expansion, do so by temporarily
9857*67e74705SXin Li     // forgetting the partially-substituted parameter pack.
9858*67e74705SXin Li     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9859*67e74705SXin Li 
9860*67e74705SXin Li     TypeLocBuilder TLB;
9861*67e74705SXin Li     TLB.reserve(From->getTypeLoc().getFullDataSize());
9862*67e74705SXin Li 
9863*67e74705SXin Li     QualType To = getDerived().TransformType(TLB, PatternTL);
9864*67e74705SXin Li     if (To.isNull())
9865*67e74705SXin Li       return ExprError();
9866*67e74705SXin Li 
9867*67e74705SXin Li     To = getDerived().RebuildPackExpansionType(To,
9868*67e74705SXin Li                                                PatternTL.getSourceRange(),
9869*67e74705SXin Li                                                ExpansionTL.getEllipsisLoc(),
9870*67e74705SXin Li                                                NumExpansions);
9871*67e74705SXin Li     if (To.isNull())
9872*67e74705SXin Li       return ExprError();
9873*67e74705SXin Li 
9874*67e74705SXin Li     PackExpansionTypeLoc ToExpansionTL
9875*67e74705SXin Li       = TLB.push<PackExpansionTypeLoc>(To);
9876*67e74705SXin Li     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
9877*67e74705SXin Li     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
9878*67e74705SXin Li   }
9879*67e74705SXin Li 
9880*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9881*67e74705SXin Li     return E;
9882*67e74705SXin Li 
9883*67e74705SXin Li   return getDerived().RebuildTypeTrait(E->getTrait(),
9884*67e74705SXin Li                                        E->getLocStart(),
9885*67e74705SXin Li                                        Args,
9886*67e74705SXin Li                                        E->getLocEnd());
9887*67e74705SXin Li }
9888*67e74705SXin Li 
9889*67e74705SXin Li template<typename Derived>
9890*67e74705SXin Li ExprResult
TransformArrayTypeTraitExpr(ArrayTypeTraitExpr * E)9891*67e74705SXin Li TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
9892*67e74705SXin Li   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
9893*67e74705SXin Li   if (!T)
9894*67e74705SXin Li     return ExprError();
9895*67e74705SXin Li 
9896*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
9897*67e74705SXin Li       T == E->getQueriedTypeSourceInfo())
9898*67e74705SXin Li     return E;
9899*67e74705SXin Li 
9900*67e74705SXin Li   ExprResult SubExpr;
9901*67e74705SXin Li   {
9902*67e74705SXin Li     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9903*67e74705SXin Li     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
9904*67e74705SXin Li     if (SubExpr.isInvalid())
9905*67e74705SXin Li       return ExprError();
9906*67e74705SXin Li 
9907*67e74705SXin Li     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
9908*67e74705SXin Li       return E;
9909*67e74705SXin Li   }
9910*67e74705SXin Li 
9911*67e74705SXin Li   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
9912*67e74705SXin Li                                             E->getLocStart(),
9913*67e74705SXin Li                                             T,
9914*67e74705SXin Li                                             SubExpr.get(),
9915*67e74705SXin Li                                             E->getLocEnd());
9916*67e74705SXin Li }
9917*67e74705SXin Li 
9918*67e74705SXin Li template<typename Derived>
9919*67e74705SXin Li ExprResult
TransformExpressionTraitExpr(ExpressionTraitExpr * E)9920*67e74705SXin Li TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
9921*67e74705SXin Li   ExprResult SubExpr;
9922*67e74705SXin Li   {
9923*67e74705SXin Li     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9924*67e74705SXin Li     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
9925*67e74705SXin Li     if (SubExpr.isInvalid())
9926*67e74705SXin Li       return ExprError();
9927*67e74705SXin Li 
9928*67e74705SXin Li     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
9929*67e74705SXin Li       return E;
9930*67e74705SXin Li   }
9931*67e74705SXin Li 
9932*67e74705SXin Li   return getDerived().RebuildExpressionTrait(
9933*67e74705SXin Li       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
9934*67e74705SXin Li }
9935*67e74705SXin Li 
9936*67e74705SXin Li template <typename Derived>
TransformParenDependentScopeDeclRefExpr(ParenExpr * PE,DependentScopeDeclRefExpr * DRE,bool AddrTaken,TypeSourceInfo ** RecoveryTSI)9937*67e74705SXin Li ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
9938*67e74705SXin Li     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
9939*67e74705SXin Li     TypeSourceInfo **RecoveryTSI) {
9940*67e74705SXin Li   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
9941*67e74705SXin Li       DRE, AddrTaken, RecoveryTSI);
9942*67e74705SXin Li 
9943*67e74705SXin Li   // Propagate both errors and recovered types, which return ExprEmpty.
9944*67e74705SXin Li   if (!NewDRE.isUsable())
9945*67e74705SXin Li     return NewDRE;
9946*67e74705SXin Li 
9947*67e74705SXin Li   // We got an expr, wrap it up in parens.
9948*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
9949*67e74705SXin Li     return PE;
9950*67e74705SXin Li   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
9951*67e74705SXin Li                                        PE->getRParen());
9952*67e74705SXin Li }
9953*67e74705SXin Li 
9954*67e74705SXin Li template <typename Derived>
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)9955*67e74705SXin Li ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
9956*67e74705SXin Li     DependentScopeDeclRefExpr *E) {
9957*67e74705SXin Li   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
9958*67e74705SXin Li                                             nullptr);
9959*67e74705SXin Li }
9960*67e74705SXin Li 
9961*67e74705SXin Li template<typename Derived>
9962*67e74705SXin Li ExprResult
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)9963*67e74705SXin Li TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
9964*67e74705SXin Li                                                DependentScopeDeclRefExpr *E,
9965*67e74705SXin Li                                                bool IsAddressOfOperand,
9966*67e74705SXin Li                                                TypeSourceInfo **RecoveryTSI) {
9967*67e74705SXin Li   assert(E->getQualifierLoc());
9968*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc
9969*67e74705SXin Li   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9970*67e74705SXin Li   if (!QualifierLoc)
9971*67e74705SXin Li     return ExprError();
9972*67e74705SXin Li   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9973*67e74705SXin Li 
9974*67e74705SXin Li   // TODO: If this is a conversion-function-id, verify that the
9975*67e74705SXin Li   // destination type name (if present) resolves the same way after
9976*67e74705SXin Li   // instantiation as it did in the local scope.
9977*67e74705SXin Li 
9978*67e74705SXin Li   DeclarationNameInfo NameInfo
9979*67e74705SXin Li     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
9980*67e74705SXin Li   if (!NameInfo.getName())
9981*67e74705SXin Li     return ExprError();
9982*67e74705SXin Li 
9983*67e74705SXin Li   if (!E->hasExplicitTemplateArgs()) {
9984*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
9985*67e74705SXin Li         QualifierLoc == E->getQualifierLoc() &&
9986*67e74705SXin Li         // Note: it is sufficient to compare the Name component of NameInfo:
9987*67e74705SXin Li         // if name has not changed, DNLoc has not changed either.
9988*67e74705SXin Li         NameInfo.getName() == E->getDeclName())
9989*67e74705SXin Li       return E;
9990*67e74705SXin Li 
9991*67e74705SXin Li     return getDerived().RebuildDependentScopeDeclRefExpr(
9992*67e74705SXin Li         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
9993*67e74705SXin Li         IsAddressOfOperand, RecoveryTSI);
9994*67e74705SXin Li   }
9995*67e74705SXin Li 
9996*67e74705SXin Li   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9997*67e74705SXin Li   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9998*67e74705SXin Li                                               E->getNumTemplateArgs(),
9999*67e74705SXin Li                                               TransArgs))
10000*67e74705SXin Li     return ExprError();
10001*67e74705SXin Li 
10002*67e74705SXin Li   return getDerived().RebuildDependentScopeDeclRefExpr(
10003*67e74705SXin Li       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10004*67e74705SXin Li       RecoveryTSI);
10005*67e74705SXin Li }
10006*67e74705SXin Li 
10007*67e74705SXin Li template<typename Derived>
10008*67e74705SXin Li ExprResult
TransformCXXConstructExpr(CXXConstructExpr * E)10009*67e74705SXin Li TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10010*67e74705SXin Li   // CXXConstructExprs other than for list-initialization and
10011*67e74705SXin Li   // CXXTemporaryObjectExpr are always implicit, so when we have
10012*67e74705SXin Li   // a 1-argument construction we just transform that argument.
10013*67e74705SXin Li   if ((E->getNumArgs() == 1 ||
10014*67e74705SXin Li        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10015*67e74705SXin Li       (!getDerived().DropCallArgument(E->getArg(0))) &&
10016*67e74705SXin Li       !E->isListInitialization())
10017*67e74705SXin Li     return getDerived().TransformExpr(E->getArg(0));
10018*67e74705SXin Li 
10019*67e74705SXin Li   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10020*67e74705SXin Li 
10021*67e74705SXin Li   QualType T = getDerived().TransformType(E->getType());
10022*67e74705SXin Li   if (T.isNull())
10023*67e74705SXin Li     return ExprError();
10024*67e74705SXin Li 
10025*67e74705SXin Li   CXXConstructorDecl *Constructor
10026*67e74705SXin Li     = cast_or_null<CXXConstructorDecl>(
10027*67e74705SXin Li                                 getDerived().TransformDecl(E->getLocStart(),
10028*67e74705SXin Li                                                          E->getConstructor()));
10029*67e74705SXin Li   if (!Constructor)
10030*67e74705SXin Li     return ExprError();
10031*67e74705SXin Li 
10032*67e74705SXin Li   bool ArgumentChanged = false;
10033*67e74705SXin Li   SmallVector<Expr*, 8> Args;
10034*67e74705SXin Li   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10035*67e74705SXin Li                                   &ArgumentChanged))
10036*67e74705SXin Li     return ExprError();
10037*67e74705SXin Li 
10038*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
10039*67e74705SXin Li       T == E->getType() &&
10040*67e74705SXin Li       Constructor == E->getConstructor() &&
10041*67e74705SXin Li       !ArgumentChanged) {
10042*67e74705SXin Li     // Mark the constructor as referenced.
10043*67e74705SXin Li     // FIXME: Instantiation-specific
10044*67e74705SXin Li     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10045*67e74705SXin Li     return E;
10046*67e74705SXin Li   }
10047*67e74705SXin Li 
10048*67e74705SXin Li   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10049*67e74705SXin Li                                               Constructor,
10050*67e74705SXin Li                                               E->isElidable(), Args,
10051*67e74705SXin Li                                               E->hadMultipleCandidates(),
10052*67e74705SXin Li                                               E->isListInitialization(),
10053*67e74705SXin Li                                               E->isStdInitListInitialization(),
10054*67e74705SXin Li                                               E->requiresZeroInitialization(),
10055*67e74705SXin Li                                               E->getConstructionKind(),
10056*67e74705SXin Li                                               E->getParenOrBraceRange());
10057*67e74705SXin Li }
10058*67e74705SXin Li 
10059*67e74705SXin Li template<typename Derived>
TransformCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)10060*67e74705SXin Li ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10061*67e74705SXin Li     CXXInheritedCtorInitExpr *E) {
10062*67e74705SXin Li   QualType T = getDerived().TransformType(E->getType());
10063*67e74705SXin Li   if (T.isNull())
10064*67e74705SXin Li     return ExprError();
10065*67e74705SXin Li 
10066*67e74705SXin Li   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10067*67e74705SXin Li       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10068*67e74705SXin Li   if (!Constructor)
10069*67e74705SXin Li     return ExprError();
10070*67e74705SXin Li 
10071*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
10072*67e74705SXin Li       T == E->getType() &&
10073*67e74705SXin Li       Constructor == E->getConstructor()) {
10074*67e74705SXin Li     // Mark the constructor as referenced.
10075*67e74705SXin Li     // FIXME: Instantiation-specific
10076*67e74705SXin Li     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10077*67e74705SXin Li     return E;
10078*67e74705SXin Li   }
10079*67e74705SXin Li 
10080*67e74705SXin Li   return getDerived().RebuildCXXInheritedCtorInitExpr(
10081*67e74705SXin Li       T, E->getLocation(), Constructor,
10082*67e74705SXin Li       E->constructsVBase(), E->inheritedFromVBase());
10083*67e74705SXin Li }
10084*67e74705SXin Li 
10085*67e74705SXin Li /// \brief Transform a C++ temporary-binding expression.
10086*67e74705SXin Li ///
10087*67e74705SXin Li /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10088*67e74705SXin Li /// transform the subexpression and return that.
10089*67e74705SXin Li template<typename Derived>
10090*67e74705SXin Li ExprResult
TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)10091*67e74705SXin Li TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10092*67e74705SXin Li   return getDerived().TransformExpr(E->getSubExpr());
10093*67e74705SXin Li }
10094*67e74705SXin Li 
10095*67e74705SXin Li /// \brief Transform a C++ expression that contains cleanups that should
10096*67e74705SXin Li /// be run after the expression is evaluated.
10097*67e74705SXin Li ///
10098*67e74705SXin Li /// Since ExprWithCleanups nodes are implicitly generated, we
10099*67e74705SXin Li /// just transform the subexpression and return that.
10100*67e74705SXin Li template<typename Derived>
10101*67e74705SXin Li ExprResult
TransformExprWithCleanups(ExprWithCleanups * E)10102*67e74705SXin Li TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10103*67e74705SXin Li   return getDerived().TransformExpr(E->getSubExpr());
10104*67e74705SXin Li }
10105*67e74705SXin Li 
10106*67e74705SXin Li template<typename Derived>
10107*67e74705SXin Li ExprResult
TransformCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)10108*67e74705SXin Li TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10109*67e74705SXin Li                                                     CXXTemporaryObjectExpr *E) {
10110*67e74705SXin Li   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10111*67e74705SXin Li   if (!T)
10112*67e74705SXin Li     return ExprError();
10113*67e74705SXin Li 
10114*67e74705SXin Li   CXXConstructorDecl *Constructor
10115*67e74705SXin Li     = cast_or_null<CXXConstructorDecl>(
10116*67e74705SXin Li                                   getDerived().TransformDecl(E->getLocStart(),
10117*67e74705SXin Li                                                          E->getConstructor()));
10118*67e74705SXin Li   if (!Constructor)
10119*67e74705SXin Li     return ExprError();
10120*67e74705SXin Li 
10121*67e74705SXin Li   bool ArgumentChanged = false;
10122*67e74705SXin Li   SmallVector<Expr*, 8> Args;
10123*67e74705SXin Li   Args.reserve(E->getNumArgs());
10124*67e74705SXin Li   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10125*67e74705SXin Li                      &ArgumentChanged))
10126*67e74705SXin Li     return ExprError();
10127*67e74705SXin Li 
10128*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
10129*67e74705SXin Li       T == E->getTypeSourceInfo() &&
10130*67e74705SXin Li       Constructor == E->getConstructor() &&
10131*67e74705SXin Li       !ArgumentChanged) {
10132*67e74705SXin Li     // FIXME: Instantiation-specific
10133*67e74705SXin Li     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10134*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
10135*67e74705SXin Li   }
10136*67e74705SXin Li 
10137*67e74705SXin Li   // FIXME: Pass in E->isListInitialization().
10138*67e74705SXin Li   return getDerived().RebuildCXXTemporaryObjectExpr(T,
10139*67e74705SXin Li                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10140*67e74705SXin Li                                                     Args,
10141*67e74705SXin Li                                                     E->getLocEnd());
10142*67e74705SXin Li }
10143*67e74705SXin Li 
10144*67e74705SXin Li template<typename Derived>
10145*67e74705SXin Li ExprResult
TransformLambdaExpr(LambdaExpr * E)10146*67e74705SXin Li TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10147*67e74705SXin Li   // Transform any init-capture expressions before entering the scope of the
10148*67e74705SXin Li   // lambda body, because they are not semantically within that scope.
10149*67e74705SXin Li   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10150*67e74705SXin Li   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10151*67e74705SXin Li   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10152*67e74705SXin Li                                   E->explicit_capture_begin());
10153*67e74705SXin Li   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10154*67e74705SXin Li                                     CEnd = E->capture_end();
10155*67e74705SXin Li        C != CEnd; ++C) {
10156*67e74705SXin Li     if (!E->isInitCapture(C))
10157*67e74705SXin Li       continue;
10158*67e74705SXin Li     EnterExpressionEvaluationContext EEEC(getSema(),
10159*67e74705SXin Li                                           Sema::PotentiallyEvaluated);
10160*67e74705SXin Li     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10161*67e74705SXin Li         C->getCapturedVar()->getInit(),
10162*67e74705SXin Li         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10163*67e74705SXin Li 
10164*67e74705SXin Li     if (NewExprInitResult.isInvalid())
10165*67e74705SXin Li       return ExprError();
10166*67e74705SXin Li     Expr *NewExprInit = NewExprInitResult.get();
10167*67e74705SXin Li 
10168*67e74705SXin Li     VarDecl *OldVD = C->getCapturedVar();
10169*67e74705SXin Li     QualType NewInitCaptureType =
10170*67e74705SXin Li         getSema().buildLambdaInitCaptureInitialization(
10171*67e74705SXin Li             C->getLocation(), OldVD->getType()->isReferenceType(),
10172*67e74705SXin Li             OldVD->getIdentifier(),
10173*67e74705SXin Li             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10174*67e74705SXin Li     NewExprInitResult = NewExprInit;
10175*67e74705SXin Li     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10176*67e74705SXin Li         std::make_pair(NewExprInitResult, NewInitCaptureType);
10177*67e74705SXin Li   }
10178*67e74705SXin Li 
10179*67e74705SXin Li   // Transform the template parameters, and add them to the current
10180*67e74705SXin Li   // instantiation scope. The null case is handled correctly.
10181*67e74705SXin Li   auto TPL = getDerived().TransformTemplateParameterList(
10182*67e74705SXin Li       E->getTemplateParameterList());
10183*67e74705SXin Li 
10184*67e74705SXin Li   // Transform the type of the original lambda's call operator.
10185*67e74705SXin Li   // The transformation MUST be done in the CurrentInstantiationScope since
10186*67e74705SXin Li   // it introduces a mapping of the original to the newly created
10187*67e74705SXin Li   // transformed parameters.
10188*67e74705SXin Li   TypeSourceInfo *NewCallOpTSI = nullptr;
10189*67e74705SXin Li   {
10190*67e74705SXin Li     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10191*67e74705SXin Li     FunctionProtoTypeLoc OldCallOpFPTL =
10192*67e74705SXin Li         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10193*67e74705SXin Li 
10194*67e74705SXin Li     TypeLocBuilder NewCallOpTLBuilder;
10195*67e74705SXin Li     SmallVector<QualType, 4> ExceptionStorage;
10196*67e74705SXin Li     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10197*67e74705SXin Li     QualType NewCallOpType = TransformFunctionProtoType(
10198*67e74705SXin Li         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10199*67e74705SXin Li         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10200*67e74705SXin Li           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10201*67e74705SXin Li                                               ExceptionStorage, Changed);
10202*67e74705SXin Li         });
10203*67e74705SXin Li     if (NewCallOpType.isNull())
10204*67e74705SXin Li       return ExprError();
10205*67e74705SXin Li     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10206*67e74705SXin Li                                                         NewCallOpType);
10207*67e74705SXin Li   }
10208*67e74705SXin Li 
10209*67e74705SXin Li   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10210*67e74705SXin Li   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10211*67e74705SXin Li   LSI->GLTemplateParameterList = TPL;
10212*67e74705SXin Li 
10213*67e74705SXin Li   // Create the local class that will describe the lambda.
10214*67e74705SXin Li   CXXRecordDecl *Class
10215*67e74705SXin Li     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10216*67e74705SXin Li                                         NewCallOpTSI,
10217*67e74705SXin Li                                         /*KnownDependent=*/false,
10218*67e74705SXin Li                                         E->getCaptureDefault());
10219*67e74705SXin Li   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10220*67e74705SXin Li 
10221*67e74705SXin Li   // Build the call operator.
10222*67e74705SXin Li   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10223*67e74705SXin Li       Class, E->getIntroducerRange(), NewCallOpTSI,
10224*67e74705SXin Li       E->getCallOperator()->getLocEnd(),
10225*67e74705SXin Li       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10226*67e74705SXin Li       E->getCallOperator()->isConstexpr());
10227*67e74705SXin Li 
10228*67e74705SXin Li   LSI->CallOperator = NewCallOperator;
10229*67e74705SXin Li 
10230*67e74705SXin Li   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10231*67e74705SXin Li   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10232*67e74705SXin Li 
10233*67e74705SXin Li   // Introduce the context of the call operator.
10234*67e74705SXin Li   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10235*67e74705SXin Li                                  /*NewThisContext*/false);
10236*67e74705SXin Li 
10237*67e74705SXin Li   // Enter the scope of the lambda.
10238*67e74705SXin Li   getSema().buildLambdaScope(LSI, NewCallOperator,
10239*67e74705SXin Li                              E->getIntroducerRange(),
10240*67e74705SXin Li                              E->getCaptureDefault(),
10241*67e74705SXin Li                              E->getCaptureDefaultLoc(),
10242*67e74705SXin Li                              E->hasExplicitParameters(),
10243*67e74705SXin Li                              E->hasExplicitResultType(),
10244*67e74705SXin Li                              E->isMutable());
10245*67e74705SXin Li 
10246*67e74705SXin Li   bool Invalid = false;
10247*67e74705SXin Li 
10248*67e74705SXin Li   // Transform captures.
10249*67e74705SXin Li   bool FinishedExplicitCaptures = false;
10250*67e74705SXin Li   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10251*67e74705SXin Li                                  CEnd = E->capture_end();
10252*67e74705SXin Li        C != CEnd; ++C) {
10253*67e74705SXin Li     // When we hit the first implicit capture, tell Sema that we've finished
10254*67e74705SXin Li     // the list of explicit captures.
10255*67e74705SXin Li     if (!FinishedExplicitCaptures && C->isImplicit()) {
10256*67e74705SXin Li       getSema().finishLambdaExplicitCaptures(LSI);
10257*67e74705SXin Li       FinishedExplicitCaptures = true;
10258*67e74705SXin Li     }
10259*67e74705SXin Li 
10260*67e74705SXin Li     // Capturing 'this' is trivial.
10261*67e74705SXin Li     if (C->capturesThis()) {
10262*67e74705SXin Li       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10263*67e74705SXin Li                                     /*BuildAndDiagnose*/ true, nullptr,
10264*67e74705SXin Li                                     C->getCaptureKind() == LCK_StarThis);
10265*67e74705SXin Li       continue;
10266*67e74705SXin Li     }
10267*67e74705SXin Li     // Captured expression will be recaptured during captured variables
10268*67e74705SXin Li     // rebuilding.
10269*67e74705SXin Li     if (C->capturesVLAType())
10270*67e74705SXin Li       continue;
10271*67e74705SXin Li 
10272*67e74705SXin Li     // Rebuild init-captures, including the implied field declaration.
10273*67e74705SXin Li     if (E->isInitCapture(C)) {
10274*67e74705SXin Li       InitCaptureInfoTy InitExprTypePair =
10275*67e74705SXin Li           InitCaptureExprsAndTypes[C - E->capture_begin()];
10276*67e74705SXin Li       ExprResult Init = InitExprTypePair.first;
10277*67e74705SXin Li       QualType InitQualType = InitExprTypePair.second;
10278*67e74705SXin Li       if (Init.isInvalid() || InitQualType.isNull()) {
10279*67e74705SXin Li         Invalid = true;
10280*67e74705SXin Li         continue;
10281*67e74705SXin Li       }
10282*67e74705SXin Li       VarDecl *OldVD = C->getCapturedVar();
10283*67e74705SXin Li       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
10284*67e74705SXin Li           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
10285*67e74705SXin Li           OldVD->getInitStyle(), Init.get());
10286*67e74705SXin Li       if (!NewVD)
10287*67e74705SXin Li         Invalid = true;
10288*67e74705SXin Li       else {
10289*67e74705SXin Li         getDerived().transformedLocalDecl(OldVD, NewVD);
10290*67e74705SXin Li       }
10291*67e74705SXin Li       getSema().buildInitCaptureField(LSI, NewVD);
10292*67e74705SXin Li       continue;
10293*67e74705SXin Li     }
10294*67e74705SXin Li 
10295*67e74705SXin Li     assert(C->capturesVariable() && "unexpected kind of lambda capture");
10296*67e74705SXin Li 
10297*67e74705SXin Li     // Determine the capture kind for Sema.
10298*67e74705SXin Li     Sema::TryCaptureKind Kind
10299*67e74705SXin Li       = C->isImplicit()? Sema::TryCapture_Implicit
10300*67e74705SXin Li                        : C->getCaptureKind() == LCK_ByCopy
10301*67e74705SXin Li                            ? Sema::TryCapture_ExplicitByVal
10302*67e74705SXin Li                            : Sema::TryCapture_ExplicitByRef;
10303*67e74705SXin Li     SourceLocation EllipsisLoc;
10304*67e74705SXin Li     if (C->isPackExpansion()) {
10305*67e74705SXin Li       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
10306*67e74705SXin Li       bool ShouldExpand = false;
10307*67e74705SXin Li       bool RetainExpansion = false;
10308*67e74705SXin Li       Optional<unsigned> NumExpansions;
10309*67e74705SXin Li       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
10310*67e74705SXin Li                                                C->getLocation(),
10311*67e74705SXin Li                                                Unexpanded,
10312*67e74705SXin Li                                                ShouldExpand, RetainExpansion,
10313*67e74705SXin Li                                                NumExpansions)) {
10314*67e74705SXin Li         Invalid = true;
10315*67e74705SXin Li         continue;
10316*67e74705SXin Li       }
10317*67e74705SXin Li 
10318*67e74705SXin Li       if (ShouldExpand) {
10319*67e74705SXin Li         // The transform has determined that we should perform an expansion;
10320*67e74705SXin Li         // transform and capture each of the arguments.
10321*67e74705SXin Li         // expansion of the pattern. Do so.
10322*67e74705SXin Li         VarDecl *Pack = C->getCapturedVar();
10323*67e74705SXin Li         for (unsigned I = 0; I != *NumExpansions; ++I) {
10324*67e74705SXin Li           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
10325*67e74705SXin Li           VarDecl *CapturedVar
10326*67e74705SXin Li             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10327*67e74705SXin Li                                                                Pack));
10328*67e74705SXin Li           if (!CapturedVar) {
10329*67e74705SXin Li             Invalid = true;
10330*67e74705SXin Li             continue;
10331*67e74705SXin Li           }
10332*67e74705SXin Li 
10333*67e74705SXin Li           // Capture the transformed variable.
10334*67e74705SXin Li           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
10335*67e74705SXin Li         }
10336*67e74705SXin Li 
10337*67e74705SXin Li         // FIXME: Retain a pack expansion if RetainExpansion is true.
10338*67e74705SXin Li 
10339*67e74705SXin Li         continue;
10340*67e74705SXin Li       }
10341*67e74705SXin Li 
10342*67e74705SXin Li       EllipsisLoc = C->getEllipsisLoc();
10343*67e74705SXin Li     }
10344*67e74705SXin Li 
10345*67e74705SXin Li     // Transform the captured variable.
10346*67e74705SXin Li     VarDecl *CapturedVar
10347*67e74705SXin Li       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
10348*67e74705SXin Li                                                          C->getCapturedVar()));
10349*67e74705SXin Li     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
10350*67e74705SXin Li       Invalid = true;
10351*67e74705SXin Li       continue;
10352*67e74705SXin Li     }
10353*67e74705SXin Li 
10354*67e74705SXin Li     // Capture the transformed variable.
10355*67e74705SXin Li     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
10356*67e74705SXin Li                                  EllipsisLoc);
10357*67e74705SXin Li   }
10358*67e74705SXin Li   if (!FinishedExplicitCaptures)
10359*67e74705SXin Li     getSema().finishLambdaExplicitCaptures(LSI);
10360*67e74705SXin Li 
10361*67e74705SXin Li   // Enter a new evaluation context to insulate the lambda from any
10362*67e74705SXin Li   // cleanups from the enclosing full-expression.
10363*67e74705SXin Li   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
10364*67e74705SXin Li 
10365*67e74705SXin Li   // Instantiate the body of the lambda expression.
10366*67e74705SXin Li   StmtResult Body =
10367*67e74705SXin Li       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
10368*67e74705SXin Li 
10369*67e74705SXin Li   // ActOnLambda* will pop the function scope for us.
10370*67e74705SXin Li   FuncScopeCleanup.disable();
10371*67e74705SXin Li 
10372*67e74705SXin Li   if (Body.isInvalid()) {
10373*67e74705SXin Li     SavedContext.pop();
10374*67e74705SXin Li     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
10375*67e74705SXin Li                                /*IsInstantiation=*/true);
10376*67e74705SXin Li     return ExprError();
10377*67e74705SXin Li   }
10378*67e74705SXin Li 
10379*67e74705SXin Li   // Copy the LSI before ActOnFinishFunctionBody removes it.
10380*67e74705SXin Li   // FIXME: This is dumb. Store the lambda information somewhere that outlives
10381*67e74705SXin Li   // the call operator.
10382*67e74705SXin Li   auto LSICopy = *LSI;
10383*67e74705SXin Li   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
10384*67e74705SXin Li                                     /*IsInstantiation*/ true);
10385*67e74705SXin Li   SavedContext.pop();
10386*67e74705SXin Li 
10387*67e74705SXin Li   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
10388*67e74705SXin Li                                    &LSICopy);
10389*67e74705SXin Li }
10390*67e74705SXin Li 
10391*67e74705SXin Li template<typename Derived>
10392*67e74705SXin Li ExprResult
TransformCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)10393*67e74705SXin Li TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
10394*67e74705SXin Li                                                   CXXUnresolvedConstructExpr *E) {
10395*67e74705SXin Li   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10396*67e74705SXin Li   if (!T)
10397*67e74705SXin Li     return ExprError();
10398*67e74705SXin Li 
10399*67e74705SXin Li   bool ArgumentChanged = false;
10400*67e74705SXin Li   SmallVector<Expr*, 8> Args;
10401*67e74705SXin Li   Args.reserve(E->arg_size());
10402*67e74705SXin Li   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
10403*67e74705SXin Li                                   &ArgumentChanged))
10404*67e74705SXin Li     return ExprError();
10405*67e74705SXin Li 
10406*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
10407*67e74705SXin Li       T == E->getTypeSourceInfo() &&
10408*67e74705SXin Li       !ArgumentChanged)
10409*67e74705SXin Li     return E;
10410*67e74705SXin Li 
10411*67e74705SXin Li   // FIXME: we're faking the locations of the commas
10412*67e74705SXin Li   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
10413*67e74705SXin Li                                                         E->getLParenLoc(),
10414*67e74705SXin Li                                                         Args,
10415*67e74705SXin Li                                                         E->getRParenLoc());
10416*67e74705SXin Li }
10417*67e74705SXin Li 
10418*67e74705SXin Li template<typename Derived>
10419*67e74705SXin Li ExprResult
TransformCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)10420*67e74705SXin Li TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
10421*67e74705SXin Li                                              CXXDependentScopeMemberExpr *E) {
10422*67e74705SXin Li   // Transform the base of the expression.
10423*67e74705SXin Li   ExprResult Base((Expr*) nullptr);
10424*67e74705SXin Li   Expr *OldBase;
10425*67e74705SXin Li   QualType BaseType;
10426*67e74705SXin Li   QualType ObjectType;
10427*67e74705SXin Li   if (!E->isImplicitAccess()) {
10428*67e74705SXin Li     OldBase = E->getBase();
10429*67e74705SXin Li     Base = getDerived().TransformExpr(OldBase);
10430*67e74705SXin Li     if (Base.isInvalid())
10431*67e74705SXin Li       return ExprError();
10432*67e74705SXin Li 
10433*67e74705SXin Li     // Start the member reference and compute the object's type.
10434*67e74705SXin Li     ParsedType ObjectTy;
10435*67e74705SXin Li     bool MayBePseudoDestructor = false;
10436*67e74705SXin Li     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10437*67e74705SXin Li                                                 E->getOperatorLoc(),
10438*67e74705SXin Li                                       E->isArrow()? tok::arrow : tok::period,
10439*67e74705SXin Li                                                 ObjectTy,
10440*67e74705SXin Li                                                 MayBePseudoDestructor);
10441*67e74705SXin Li     if (Base.isInvalid())
10442*67e74705SXin Li       return ExprError();
10443*67e74705SXin Li 
10444*67e74705SXin Li     ObjectType = ObjectTy.get();
10445*67e74705SXin Li     BaseType = ((Expr*) Base.get())->getType();
10446*67e74705SXin Li   } else {
10447*67e74705SXin Li     OldBase = nullptr;
10448*67e74705SXin Li     BaseType = getDerived().TransformType(E->getBaseType());
10449*67e74705SXin Li     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
10450*67e74705SXin Li   }
10451*67e74705SXin Li 
10452*67e74705SXin Li   // Transform the first part of the nested-name-specifier that qualifies
10453*67e74705SXin Li   // the member name.
10454*67e74705SXin Li   NamedDecl *FirstQualifierInScope
10455*67e74705SXin Li     = getDerived().TransformFirstQualifierInScope(
10456*67e74705SXin Li                                             E->getFirstQualifierFoundInScope(),
10457*67e74705SXin Li                                             E->getQualifierLoc().getBeginLoc());
10458*67e74705SXin Li 
10459*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
10460*67e74705SXin Li   if (E->getQualifier()) {
10461*67e74705SXin Li     QualifierLoc
10462*67e74705SXin Li       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
10463*67e74705SXin Li                                                      ObjectType,
10464*67e74705SXin Li                                                      FirstQualifierInScope);
10465*67e74705SXin Li     if (!QualifierLoc)
10466*67e74705SXin Li       return ExprError();
10467*67e74705SXin Li   }
10468*67e74705SXin Li 
10469*67e74705SXin Li   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10470*67e74705SXin Li 
10471*67e74705SXin Li   // TODO: If this is a conversion-function-id, verify that the
10472*67e74705SXin Li   // destination type name (if present) resolves the same way after
10473*67e74705SXin Li   // instantiation as it did in the local scope.
10474*67e74705SXin Li 
10475*67e74705SXin Li   DeclarationNameInfo NameInfo
10476*67e74705SXin Li     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
10477*67e74705SXin Li   if (!NameInfo.getName())
10478*67e74705SXin Li     return ExprError();
10479*67e74705SXin Li 
10480*67e74705SXin Li   if (!E->hasExplicitTemplateArgs()) {
10481*67e74705SXin Li     // This is a reference to a member without an explicitly-specified
10482*67e74705SXin Li     // template argument list. Optimize for this common case.
10483*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
10484*67e74705SXin Li         Base.get() == OldBase &&
10485*67e74705SXin Li         BaseType == E->getBaseType() &&
10486*67e74705SXin Li         QualifierLoc == E->getQualifierLoc() &&
10487*67e74705SXin Li         NameInfo.getName() == E->getMember() &&
10488*67e74705SXin Li         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
10489*67e74705SXin Li       return E;
10490*67e74705SXin Li 
10491*67e74705SXin Li     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10492*67e74705SXin Li                                                        BaseType,
10493*67e74705SXin Li                                                        E->isArrow(),
10494*67e74705SXin Li                                                        E->getOperatorLoc(),
10495*67e74705SXin Li                                                        QualifierLoc,
10496*67e74705SXin Li                                                        TemplateKWLoc,
10497*67e74705SXin Li                                                        FirstQualifierInScope,
10498*67e74705SXin Li                                                        NameInfo,
10499*67e74705SXin Li                                                        /*TemplateArgs*/nullptr);
10500*67e74705SXin Li   }
10501*67e74705SXin Li 
10502*67e74705SXin Li   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10503*67e74705SXin Li   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10504*67e74705SXin Li                                               E->getNumTemplateArgs(),
10505*67e74705SXin Li                                               TransArgs))
10506*67e74705SXin Li     return ExprError();
10507*67e74705SXin Li 
10508*67e74705SXin Li   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
10509*67e74705SXin Li                                                      BaseType,
10510*67e74705SXin Li                                                      E->isArrow(),
10511*67e74705SXin Li                                                      E->getOperatorLoc(),
10512*67e74705SXin Li                                                      QualifierLoc,
10513*67e74705SXin Li                                                      TemplateKWLoc,
10514*67e74705SXin Li                                                      FirstQualifierInScope,
10515*67e74705SXin Li                                                      NameInfo,
10516*67e74705SXin Li                                                      &TransArgs);
10517*67e74705SXin Li }
10518*67e74705SXin Li 
10519*67e74705SXin Li template<typename Derived>
10520*67e74705SXin Li ExprResult
TransformUnresolvedMemberExpr(UnresolvedMemberExpr * Old)10521*67e74705SXin Li TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
10522*67e74705SXin Li   // Transform the base of the expression.
10523*67e74705SXin Li   ExprResult Base((Expr*) nullptr);
10524*67e74705SXin Li   QualType BaseType;
10525*67e74705SXin Li   if (!Old->isImplicitAccess()) {
10526*67e74705SXin Li     Base = getDerived().TransformExpr(Old->getBase());
10527*67e74705SXin Li     if (Base.isInvalid())
10528*67e74705SXin Li       return ExprError();
10529*67e74705SXin Li     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
10530*67e74705SXin Li                                                      Old->isArrow());
10531*67e74705SXin Li     if (Base.isInvalid())
10532*67e74705SXin Li       return ExprError();
10533*67e74705SXin Li     BaseType = Base.get()->getType();
10534*67e74705SXin Li   } else {
10535*67e74705SXin Li     BaseType = getDerived().TransformType(Old->getBaseType());
10536*67e74705SXin Li   }
10537*67e74705SXin Li 
10538*67e74705SXin Li   NestedNameSpecifierLoc QualifierLoc;
10539*67e74705SXin Li   if (Old->getQualifierLoc()) {
10540*67e74705SXin Li     QualifierLoc
10541*67e74705SXin Li     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10542*67e74705SXin Li     if (!QualifierLoc)
10543*67e74705SXin Li       return ExprError();
10544*67e74705SXin Li   }
10545*67e74705SXin Li 
10546*67e74705SXin Li   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10547*67e74705SXin Li 
10548*67e74705SXin Li   LookupResult R(SemaRef, Old->getMemberNameInfo(),
10549*67e74705SXin Li                  Sema::LookupOrdinaryName);
10550*67e74705SXin Li 
10551*67e74705SXin Li   // Transform all the decls.
10552*67e74705SXin Li   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
10553*67e74705SXin Li          E = Old->decls_end(); I != E; ++I) {
10554*67e74705SXin Li     NamedDecl *InstD = static_cast<NamedDecl*>(
10555*67e74705SXin Li                                 getDerived().TransformDecl(Old->getMemberLoc(),
10556*67e74705SXin Li                                                            *I));
10557*67e74705SXin Li     if (!InstD) {
10558*67e74705SXin Li       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10559*67e74705SXin Li       // This can happen because of dependent hiding.
10560*67e74705SXin Li       if (isa<UsingShadowDecl>(*I))
10561*67e74705SXin Li         continue;
10562*67e74705SXin Li       else {
10563*67e74705SXin Li         R.clear();
10564*67e74705SXin Li         return ExprError();
10565*67e74705SXin Li       }
10566*67e74705SXin Li     }
10567*67e74705SXin Li 
10568*67e74705SXin Li     // Expand using declarations.
10569*67e74705SXin Li     if (isa<UsingDecl>(InstD)) {
10570*67e74705SXin Li       UsingDecl *UD = cast<UsingDecl>(InstD);
10571*67e74705SXin Li       for (auto *I : UD->shadows())
10572*67e74705SXin Li         R.addDecl(I);
10573*67e74705SXin Li       continue;
10574*67e74705SXin Li     }
10575*67e74705SXin Li 
10576*67e74705SXin Li     R.addDecl(InstD);
10577*67e74705SXin Li   }
10578*67e74705SXin Li 
10579*67e74705SXin Li   R.resolveKind();
10580*67e74705SXin Li 
10581*67e74705SXin Li   // Determine the naming class.
10582*67e74705SXin Li   if (Old->getNamingClass()) {
10583*67e74705SXin Li     CXXRecordDecl *NamingClass
10584*67e74705SXin Li       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10585*67e74705SXin Li                                                           Old->getMemberLoc(),
10586*67e74705SXin Li                                                         Old->getNamingClass()));
10587*67e74705SXin Li     if (!NamingClass)
10588*67e74705SXin Li       return ExprError();
10589*67e74705SXin Li 
10590*67e74705SXin Li     R.setNamingClass(NamingClass);
10591*67e74705SXin Li   }
10592*67e74705SXin Li 
10593*67e74705SXin Li   TemplateArgumentListInfo TransArgs;
10594*67e74705SXin Li   if (Old->hasExplicitTemplateArgs()) {
10595*67e74705SXin Li     TransArgs.setLAngleLoc(Old->getLAngleLoc());
10596*67e74705SXin Li     TransArgs.setRAngleLoc(Old->getRAngleLoc());
10597*67e74705SXin Li     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10598*67e74705SXin Li                                                 Old->getNumTemplateArgs(),
10599*67e74705SXin Li                                                 TransArgs))
10600*67e74705SXin Li       return ExprError();
10601*67e74705SXin Li   }
10602*67e74705SXin Li 
10603*67e74705SXin Li   // FIXME: to do this check properly, we will need to preserve the
10604*67e74705SXin Li   // first-qualifier-in-scope here, just in case we had a dependent
10605*67e74705SXin Li   // base (and therefore couldn't do the check) and a
10606*67e74705SXin Li   // nested-name-qualifier (and therefore could do the lookup).
10607*67e74705SXin Li   NamedDecl *FirstQualifierInScope = nullptr;
10608*67e74705SXin Li 
10609*67e74705SXin Li   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
10610*67e74705SXin Li                                                   BaseType,
10611*67e74705SXin Li                                                   Old->getOperatorLoc(),
10612*67e74705SXin Li                                                   Old->isArrow(),
10613*67e74705SXin Li                                                   QualifierLoc,
10614*67e74705SXin Li                                                   TemplateKWLoc,
10615*67e74705SXin Li                                                   FirstQualifierInScope,
10616*67e74705SXin Li                                                   R,
10617*67e74705SXin Li                                               (Old->hasExplicitTemplateArgs()
10618*67e74705SXin Li                                                   ? &TransArgs : nullptr));
10619*67e74705SXin Li }
10620*67e74705SXin Li 
10621*67e74705SXin Li template<typename Derived>
10622*67e74705SXin Li ExprResult
TransformCXXNoexceptExpr(CXXNoexceptExpr * E)10623*67e74705SXin Li TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
10624*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
10625*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
10626*67e74705SXin Li   if (SubExpr.isInvalid())
10627*67e74705SXin Li     return ExprError();
10628*67e74705SXin Li 
10629*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
10630*67e74705SXin Li     return E;
10631*67e74705SXin Li 
10632*67e74705SXin Li   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
10633*67e74705SXin Li }
10634*67e74705SXin Li 
10635*67e74705SXin Li template<typename Derived>
10636*67e74705SXin Li ExprResult
TransformPackExpansionExpr(PackExpansionExpr * E)10637*67e74705SXin Li TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
10638*67e74705SXin Li   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
10639*67e74705SXin Li   if (Pattern.isInvalid())
10640*67e74705SXin Li     return ExprError();
10641*67e74705SXin Li 
10642*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
10643*67e74705SXin Li     return E;
10644*67e74705SXin Li 
10645*67e74705SXin Li   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
10646*67e74705SXin Li                                            E->getNumExpansions());
10647*67e74705SXin Li }
10648*67e74705SXin Li 
10649*67e74705SXin Li template<typename Derived>
10650*67e74705SXin Li ExprResult
TransformSizeOfPackExpr(SizeOfPackExpr * E)10651*67e74705SXin Li TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
10652*67e74705SXin Li   // If E is not value-dependent, then nothing will change when we transform it.
10653*67e74705SXin Li   // Note: This is an instantiation-centric view.
10654*67e74705SXin Li   if (!E->isValueDependent())
10655*67e74705SXin Li     return E;
10656*67e74705SXin Li 
10657*67e74705SXin Li   EnterExpressionEvaluationContext Unevaluated(getSema(), Sema::Unevaluated);
10658*67e74705SXin Li 
10659*67e74705SXin Li   ArrayRef<TemplateArgument> PackArgs;
10660*67e74705SXin Li   TemplateArgument ArgStorage;
10661*67e74705SXin Li 
10662*67e74705SXin Li   // Find the argument list to transform.
10663*67e74705SXin Li   if (E->isPartiallySubstituted()) {
10664*67e74705SXin Li     PackArgs = E->getPartialArguments();
10665*67e74705SXin Li   } else if (E->isValueDependent()) {
10666*67e74705SXin Li     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
10667*67e74705SXin Li     bool ShouldExpand = false;
10668*67e74705SXin Li     bool RetainExpansion = false;
10669*67e74705SXin Li     Optional<unsigned> NumExpansions;
10670*67e74705SXin Li     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
10671*67e74705SXin Li                                              Unexpanded,
10672*67e74705SXin Li                                              ShouldExpand, RetainExpansion,
10673*67e74705SXin Li                                              NumExpansions))
10674*67e74705SXin Li       return ExprError();
10675*67e74705SXin Li 
10676*67e74705SXin Li     // If we need to expand the pack, build a template argument from it and
10677*67e74705SXin Li     // expand that.
10678*67e74705SXin Li     if (ShouldExpand) {
10679*67e74705SXin Li       auto *Pack = E->getPack();
10680*67e74705SXin Li       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
10681*67e74705SXin Li         ArgStorage = getSema().Context.getPackExpansionType(
10682*67e74705SXin Li             getSema().Context.getTypeDeclType(TTPD), None);
10683*67e74705SXin Li       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
10684*67e74705SXin Li         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
10685*67e74705SXin Li       } else {
10686*67e74705SXin Li         auto *VD = cast<ValueDecl>(Pack);
10687*67e74705SXin Li         ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
10688*67e74705SXin Li                                                     VK_RValue, E->getPackLoc());
10689*67e74705SXin Li         if (DRE.isInvalid())
10690*67e74705SXin Li           return ExprError();
10691*67e74705SXin Li         ArgStorage = new (getSema().Context) PackExpansionExpr(
10692*67e74705SXin Li             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
10693*67e74705SXin Li       }
10694*67e74705SXin Li       PackArgs = ArgStorage;
10695*67e74705SXin Li     }
10696*67e74705SXin Li   }
10697*67e74705SXin Li 
10698*67e74705SXin Li   // If we're not expanding the pack, just transform the decl.
10699*67e74705SXin Li   if (!PackArgs.size()) {
10700*67e74705SXin Li     auto *Pack = cast_or_null<NamedDecl>(
10701*67e74705SXin Li         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
10702*67e74705SXin Li     if (!Pack)
10703*67e74705SXin Li       return ExprError();
10704*67e74705SXin Li     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
10705*67e74705SXin Li                                               E->getPackLoc(),
10706*67e74705SXin Li                                               E->getRParenLoc(), None, None);
10707*67e74705SXin Li   }
10708*67e74705SXin Li 
10709*67e74705SXin Li   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
10710*67e74705SXin Li                                                E->getPackLoc());
10711*67e74705SXin Li   {
10712*67e74705SXin Li     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
10713*67e74705SXin Li     typedef TemplateArgumentLocInventIterator<
10714*67e74705SXin Li         Derived, const TemplateArgument*> PackLocIterator;
10715*67e74705SXin Li     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
10716*67e74705SXin Li                                    PackLocIterator(*this, PackArgs.end()),
10717*67e74705SXin Li                                    TransformedPackArgs, /*Uneval*/true))
10718*67e74705SXin Li       return ExprError();
10719*67e74705SXin Li   }
10720*67e74705SXin Li 
10721*67e74705SXin Li   SmallVector<TemplateArgument, 8> Args;
10722*67e74705SXin Li   bool PartialSubstitution = false;
10723*67e74705SXin Li   for (auto &Loc : TransformedPackArgs.arguments()) {
10724*67e74705SXin Li     Args.push_back(Loc.getArgument());
10725*67e74705SXin Li     if (Loc.getArgument().isPackExpansion())
10726*67e74705SXin Li       PartialSubstitution = true;
10727*67e74705SXin Li   }
10728*67e74705SXin Li 
10729*67e74705SXin Li   if (PartialSubstitution)
10730*67e74705SXin Li     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10731*67e74705SXin Li                                               E->getPackLoc(),
10732*67e74705SXin Li                                               E->getRParenLoc(), None, Args);
10733*67e74705SXin Li 
10734*67e74705SXin Li   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
10735*67e74705SXin Li                                             E->getPackLoc(), E->getRParenLoc(),
10736*67e74705SXin Li                                             Args.size(), None);
10737*67e74705SXin Li }
10738*67e74705SXin Li 
10739*67e74705SXin Li template<typename Derived>
10740*67e74705SXin Li ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)10741*67e74705SXin Li TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
10742*67e74705SXin Li                                           SubstNonTypeTemplateParmPackExpr *E) {
10743*67e74705SXin Li   // Default behavior is to do nothing with this transformation.
10744*67e74705SXin Li   return E;
10745*67e74705SXin Li }
10746*67e74705SXin Li 
10747*67e74705SXin Li template<typename Derived>
10748*67e74705SXin Li ExprResult
TransformSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)10749*67e74705SXin Li TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
10750*67e74705SXin Li                                           SubstNonTypeTemplateParmExpr *E) {
10751*67e74705SXin Li   // Default behavior is to do nothing with this transformation.
10752*67e74705SXin Li   return E;
10753*67e74705SXin Li }
10754*67e74705SXin Li 
10755*67e74705SXin Li template<typename Derived>
10756*67e74705SXin Li ExprResult
TransformFunctionParmPackExpr(FunctionParmPackExpr * E)10757*67e74705SXin Li TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
10758*67e74705SXin Li   // Default behavior is to do nothing with this transformation.
10759*67e74705SXin Li   return E;
10760*67e74705SXin Li }
10761*67e74705SXin Li 
10762*67e74705SXin Li template<typename Derived>
10763*67e74705SXin Li ExprResult
TransformMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)10764*67e74705SXin Li TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
10765*67e74705SXin Li                                                   MaterializeTemporaryExpr *E) {
10766*67e74705SXin Li   return getDerived().TransformExpr(E->GetTemporaryExpr());
10767*67e74705SXin Li }
10768*67e74705SXin Li 
10769*67e74705SXin Li template<typename Derived>
10770*67e74705SXin Li ExprResult
TransformCXXFoldExpr(CXXFoldExpr * E)10771*67e74705SXin Li TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
10772*67e74705SXin Li   Expr *Pattern = E->getPattern();
10773*67e74705SXin Li 
10774*67e74705SXin Li   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10775*67e74705SXin Li   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
10776*67e74705SXin Li   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
10777*67e74705SXin Li 
10778*67e74705SXin Li   // Determine whether the set of unexpanded parameter packs can and should
10779*67e74705SXin Li   // be expanded.
10780*67e74705SXin Li   bool Expand = true;
10781*67e74705SXin Li   bool RetainExpansion = false;
10782*67e74705SXin Li   Optional<unsigned> NumExpansions;
10783*67e74705SXin Li   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
10784*67e74705SXin Li                                            Pattern->getSourceRange(),
10785*67e74705SXin Li                                            Unexpanded,
10786*67e74705SXin Li                                            Expand, RetainExpansion,
10787*67e74705SXin Li                                            NumExpansions))
10788*67e74705SXin Li     return true;
10789*67e74705SXin Li 
10790*67e74705SXin Li   if (!Expand) {
10791*67e74705SXin Li     // Do not expand any packs here, just transform and rebuild a fold
10792*67e74705SXin Li     // expression.
10793*67e74705SXin Li     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10794*67e74705SXin Li 
10795*67e74705SXin Li     ExprResult LHS =
10796*67e74705SXin Li         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
10797*67e74705SXin Li     if (LHS.isInvalid())
10798*67e74705SXin Li       return true;
10799*67e74705SXin Li 
10800*67e74705SXin Li     ExprResult RHS =
10801*67e74705SXin Li         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
10802*67e74705SXin Li     if (RHS.isInvalid())
10803*67e74705SXin Li       return true;
10804*67e74705SXin Li 
10805*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
10806*67e74705SXin Li         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
10807*67e74705SXin Li       return E;
10808*67e74705SXin Li 
10809*67e74705SXin Li     return getDerived().RebuildCXXFoldExpr(
10810*67e74705SXin Li         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
10811*67e74705SXin Li         RHS.get(), E->getLocEnd());
10812*67e74705SXin Li   }
10813*67e74705SXin Li 
10814*67e74705SXin Li   // The transform has determined that we should perform an elementwise
10815*67e74705SXin Li   // expansion of the pattern. Do so.
10816*67e74705SXin Li   ExprResult Result = getDerived().TransformExpr(E->getInit());
10817*67e74705SXin Li   if (Result.isInvalid())
10818*67e74705SXin Li     return true;
10819*67e74705SXin Li   bool LeftFold = E->isLeftFold();
10820*67e74705SXin Li 
10821*67e74705SXin Li   // If we're retaining an expansion for a right fold, it is the innermost
10822*67e74705SXin Li   // component and takes the init (if any).
10823*67e74705SXin Li   if (!LeftFold && RetainExpansion) {
10824*67e74705SXin Li     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10825*67e74705SXin Li 
10826*67e74705SXin Li     ExprResult Out = getDerived().TransformExpr(Pattern);
10827*67e74705SXin Li     if (Out.isInvalid())
10828*67e74705SXin Li       return true;
10829*67e74705SXin Li 
10830*67e74705SXin Li     Result = getDerived().RebuildCXXFoldExpr(
10831*67e74705SXin Li         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
10832*67e74705SXin Li         Result.get(), E->getLocEnd());
10833*67e74705SXin Li     if (Result.isInvalid())
10834*67e74705SXin Li       return true;
10835*67e74705SXin Li   }
10836*67e74705SXin Li 
10837*67e74705SXin Li   for (unsigned I = 0; I != *NumExpansions; ++I) {
10838*67e74705SXin Li     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
10839*67e74705SXin Li         getSema(), LeftFold ? I : *NumExpansions - I - 1);
10840*67e74705SXin Li     ExprResult Out = getDerived().TransformExpr(Pattern);
10841*67e74705SXin Li     if (Out.isInvalid())
10842*67e74705SXin Li       return true;
10843*67e74705SXin Li 
10844*67e74705SXin Li     if (Out.get()->containsUnexpandedParameterPack()) {
10845*67e74705SXin Li       // We still have a pack; retain a pack expansion for this slice.
10846*67e74705SXin Li       Result = getDerived().RebuildCXXFoldExpr(
10847*67e74705SXin Li           E->getLocStart(),
10848*67e74705SXin Li           LeftFold ? Result.get() : Out.get(),
10849*67e74705SXin Li           E->getOperator(), E->getEllipsisLoc(),
10850*67e74705SXin Li           LeftFold ? Out.get() : Result.get(),
10851*67e74705SXin Li           E->getLocEnd());
10852*67e74705SXin Li     } else if (Result.isUsable()) {
10853*67e74705SXin Li       // We've got down to a single element; build a binary operator.
10854*67e74705SXin Li       Result = getDerived().RebuildBinaryOperator(
10855*67e74705SXin Li           E->getEllipsisLoc(), E->getOperator(),
10856*67e74705SXin Li           LeftFold ? Result.get() : Out.get(),
10857*67e74705SXin Li           LeftFold ? Out.get() : Result.get());
10858*67e74705SXin Li     } else
10859*67e74705SXin Li       Result = Out;
10860*67e74705SXin Li 
10861*67e74705SXin Li     if (Result.isInvalid())
10862*67e74705SXin Li       return true;
10863*67e74705SXin Li   }
10864*67e74705SXin Li 
10865*67e74705SXin Li   // If we're retaining an expansion for a left fold, it is the outermost
10866*67e74705SXin Li   // component and takes the complete expansion so far as its init (if any).
10867*67e74705SXin Li   if (LeftFold && RetainExpansion) {
10868*67e74705SXin Li     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10869*67e74705SXin Li 
10870*67e74705SXin Li     ExprResult Out = getDerived().TransformExpr(Pattern);
10871*67e74705SXin Li     if (Out.isInvalid())
10872*67e74705SXin Li       return true;
10873*67e74705SXin Li 
10874*67e74705SXin Li     Result = getDerived().RebuildCXXFoldExpr(
10875*67e74705SXin Li         E->getLocStart(), Result.get(),
10876*67e74705SXin Li         E->getOperator(), E->getEllipsisLoc(),
10877*67e74705SXin Li         Out.get(), E->getLocEnd());
10878*67e74705SXin Li     if (Result.isInvalid())
10879*67e74705SXin Li       return true;
10880*67e74705SXin Li   }
10881*67e74705SXin Li 
10882*67e74705SXin Li   // If we had no init and an empty pack, and we're not retaining an expansion,
10883*67e74705SXin Li   // then produce a fallback value or error.
10884*67e74705SXin Li   if (Result.isUnset())
10885*67e74705SXin Li     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
10886*67e74705SXin Li                                                 E->getOperator());
10887*67e74705SXin Li 
10888*67e74705SXin Li   return Result;
10889*67e74705SXin Li }
10890*67e74705SXin Li 
10891*67e74705SXin Li template<typename Derived>
10892*67e74705SXin Li ExprResult
TransformCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)10893*67e74705SXin Li TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
10894*67e74705SXin Li     CXXStdInitializerListExpr *E) {
10895*67e74705SXin Li   return getDerived().TransformExpr(E->getSubExpr());
10896*67e74705SXin Li }
10897*67e74705SXin Li 
10898*67e74705SXin Li template<typename Derived>
10899*67e74705SXin Li ExprResult
TransformObjCStringLiteral(ObjCStringLiteral * E)10900*67e74705SXin Li TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
10901*67e74705SXin Li   return SemaRef.MaybeBindToTemporary(E);
10902*67e74705SXin Li }
10903*67e74705SXin Li 
10904*67e74705SXin Li template<typename Derived>
10905*67e74705SXin Li ExprResult
TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)10906*67e74705SXin Li TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
10907*67e74705SXin Li   return E;
10908*67e74705SXin Li }
10909*67e74705SXin Li 
10910*67e74705SXin Li template<typename Derived>
10911*67e74705SXin Li ExprResult
TransformObjCBoxedExpr(ObjCBoxedExpr * E)10912*67e74705SXin Li TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
10913*67e74705SXin Li   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10914*67e74705SXin Li   if (SubExpr.isInvalid())
10915*67e74705SXin Li     return ExprError();
10916*67e74705SXin Li 
10917*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
10918*67e74705SXin Li       SubExpr.get() == E->getSubExpr())
10919*67e74705SXin Li     return E;
10920*67e74705SXin Li 
10921*67e74705SXin Li   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
10922*67e74705SXin Li }
10923*67e74705SXin Li 
10924*67e74705SXin Li template<typename Derived>
10925*67e74705SXin Li ExprResult
TransformObjCArrayLiteral(ObjCArrayLiteral * E)10926*67e74705SXin Li TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
10927*67e74705SXin Li   // Transform each of the elements.
10928*67e74705SXin Li   SmallVector<Expr *, 8> Elements;
10929*67e74705SXin Li   bool ArgChanged = false;
10930*67e74705SXin Li   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
10931*67e74705SXin Li                                   /*IsCall=*/false, Elements, &ArgChanged))
10932*67e74705SXin Li     return ExprError();
10933*67e74705SXin Li 
10934*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10935*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
10936*67e74705SXin Li 
10937*67e74705SXin Li   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
10938*67e74705SXin Li                                               Elements.data(),
10939*67e74705SXin Li                                               Elements.size());
10940*67e74705SXin Li }
10941*67e74705SXin Li 
10942*67e74705SXin Li template<typename Derived>
10943*67e74705SXin Li ExprResult
TransformObjCDictionaryLiteral(ObjCDictionaryLiteral * E)10944*67e74705SXin Li TreeTransform<Derived>::TransformObjCDictionaryLiteral(
10945*67e74705SXin Li                                                     ObjCDictionaryLiteral *E) {
10946*67e74705SXin Li   // Transform each of the elements.
10947*67e74705SXin Li   SmallVector<ObjCDictionaryElement, 8> Elements;
10948*67e74705SXin Li   bool ArgChanged = false;
10949*67e74705SXin Li   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
10950*67e74705SXin Li     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
10951*67e74705SXin Li 
10952*67e74705SXin Li     if (OrigElement.isPackExpansion()) {
10953*67e74705SXin Li       // This key/value element is a pack expansion.
10954*67e74705SXin Li       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10955*67e74705SXin Li       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
10956*67e74705SXin Li       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
10957*67e74705SXin Li       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
10958*67e74705SXin Li 
10959*67e74705SXin Li       // Determine whether the set of unexpanded parameter packs can
10960*67e74705SXin Li       // and should be expanded.
10961*67e74705SXin Li       bool Expand = true;
10962*67e74705SXin Li       bool RetainExpansion = false;
10963*67e74705SXin Li       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
10964*67e74705SXin Li       Optional<unsigned> NumExpansions = OrigNumExpansions;
10965*67e74705SXin Li       SourceRange PatternRange(OrigElement.Key->getLocStart(),
10966*67e74705SXin Li                                OrigElement.Value->getLocEnd());
10967*67e74705SXin Li      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
10968*67e74705SXin Li                                                PatternRange,
10969*67e74705SXin Li                                                Unexpanded,
10970*67e74705SXin Li                                                Expand, RetainExpansion,
10971*67e74705SXin Li                                                NumExpansions))
10972*67e74705SXin Li         return ExprError();
10973*67e74705SXin Li 
10974*67e74705SXin Li       if (!Expand) {
10975*67e74705SXin Li         // The transform has determined that we should perform a simple
10976*67e74705SXin Li         // transformation on the pack expansion, producing another pack
10977*67e74705SXin Li         // expansion.
10978*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10979*67e74705SXin Li         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
10980*67e74705SXin Li         if (Key.isInvalid())
10981*67e74705SXin Li           return ExprError();
10982*67e74705SXin Li 
10983*67e74705SXin Li         if (Key.get() != OrigElement.Key)
10984*67e74705SXin Li           ArgChanged = true;
10985*67e74705SXin Li 
10986*67e74705SXin Li         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
10987*67e74705SXin Li         if (Value.isInvalid())
10988*67e74705SXin Li           return ExprError();
10989*67e74705SXin Li 
10990*67e74705SXin Li         if (Value.get() != OrigElement.Value)
10991*67e74705SXin Li           ArgChanged = true;
10992*67e74705SXin Li 
10993*67e74705SXin Li         ObjCDictionaryElement Expansion = {
10994*67e74705SXin Li           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
10995*67e74705SXin Li         };
10996*67e74705SXin Li         Elements.push_back(Expansion);
10997*67e74705SXin Li         continue;
10998*67e74705SXin Li       }
10999*67e74705SXin Li 
11000*67e74705SXin Li       // Record right away that the argument was changed.  This needs
11001*67e74705SXin Li       // to happen even if the array expands to nothing.
11002*67e74705SXin Li       ArgChanged = true;
11003*67e74705SXin Li 
11004*67e74705SXin Li       // The transform has determined that we should perform an elementwise
11005*67e74705SXin Li       // expansion of the pattern. Do so.
11006*67e74705SXin Li       for (unsigned I = 0; I != *NumExpansions; ++I) {
11007*67e74705SXin Li         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11008*67e74705SXin Li         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11009*67e74705SXin Li         if (Key.isInvalid())
11010*67e74705SXin Li           return ExprError();
11011*67e74705SXin Li 
11012*67e74705SXin Li         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11013*67e74705SXin Li         if (Value.isInvalid())
11014*67e74705SXin Li           return ExprError();
11015*67e74705SXin Li 
11016*67e74705SXin Li         ObjCDictionaryElement Element = {
11017*67e74705SXin Li           Key.get(), Value.get(), SourceLocation(), NumExpansions
11018*67e74705SXin Li         };
11019*67e74705SXin Li 
11020*67e74705SXin Li         // If any unexpanded parameter packs remain, we still have a
11021*67e74705SXin Li         // pack expansion.
11022*67e74705SXin Li         // FIXME: Can this really happen?
11023*67e74705SXin Li         if (Key.get()->containsUnexpandedParameterPack() ||
11024*67e74705SXin Li             Value.get()->containsUnexpandedParameterPack())
11025*67e74705SXin Li           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11026*67e74705SXin Li 
11027*67e74705SXin Li         Elements.push_back(Element);
11028*67e74705SXin Li       }
11029*67e74705SXin Li 
11030*67e74705SXin Li       // FIXME: Retain a pack expansion if RetainExpansion is true.
11031*67e74705SXin Li 
11032*67e74705SXin Li       // We've finished with this pack expansion.
11033*67e74705SXin Li       continue;
11034*67e74705SXin Li     }
11035*67e74705SXin Li 
11036*67e74705SXin Li     // Transform and check key.
11037*67e74705SXin Li     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11038*67e74705SXin Li     if (Key.isInvalid())
11039*67e74705SXin Li       return ExprError();
11040*67e74705SXin Li 
11041*67e74705SXin Li     if (Key.get() != OrigElement.Key)
11042*67e74705SXin Li       ArgChanged = true;
11043*67e74705SXin Li 
11044*67e74705SXin Li     // Transform and check value.
11045*67e74705SXin Li     ExprResult Value
11046*67e74705SXin Li       = getDerived().TransformExpr(OrigElement.Value);
11047*67e74705SXin Li     if (Value.isInvalid())
11048*67e74705SXin Li       return ExprError();
11049*67e74705SXin Li 
11050*67e74705SXin Li     if (Value.get() != OrigElement.Value)
11051*67e74705SXin Li       ArgChanged = true;
11052*67e74705SXin Li 
11053*67e74705SXin Li     ObjCDictionaryElement Element = {
11054*67e74705SXin Li       Key.get(), Value.get(), SourceLocation(), None
11055*67e74705SXin Li     };
11056*67e74705SXin Li     Elements.push_back(Element);
11057*67e74705SXin Li   }
11058*67e74705SXin Li 
11059*67e74705SXin Li   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11060*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
11061*67e74705SXin Li 
11062*67e74705SXin Li   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11063*67e74705SXin Li                                                    Elements);
11064*67e74705SXin Li }
11065*67e74705SXin Li 
11066*67e74705SXin Li template<typename Derived>
11067*67e74705SXin Li ExprResult
TransformObjCEncodeExpr(ObjCEncodeExpr * E)11068*67e74705SXin Li TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11069*67e74705SXin Li   TypeSourceInfo *EncodedTypeInfo
11070*67e74705SXin Li     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11071*67e74705SXin Li   if (!EncodedTypeInfo)
11072*67e74705SXin Li     return ExprError();
11073*67e74705SXin Li 
11074*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11075*67e74705SXin Li       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11076*67e74705SXin Li     return E;
11077*67e74705SXin Li 
11078*67e74705SXin Li   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11079*67e74705SXin Li                                             EncodedTypeInfo,
11080*67e74705SXin Li                                             E->getRParenLoc());
11081*67e74705SXin Li }
11082*67e74705SXin Li 
11083*67e74705SXin Li template<typename Derived>
11084*67e74705SXin Li ExprResult TreeTransform<Derived>::
TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)11085*67e74705SXin Li TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11086*67e74705SXin Li   // This is a kind of implicit conversion, and it needs to get dropped
11087*67e74705SXin Li   // and recomputed for the same general reasons that ImplicitCastExprs
11088*67e74705SXin Li   // do, as well a more specific one: this expression is only valid when
11089*67e74705SXin Li   // it appears *immediately* as an argument expression.
11090*67e74705SXin Li   return getDerived().TransformExpr(E->getSubExpr());
11091*67e74705SXin Li }
11092*67e74705SXin Li 
11093*67e74705SXin Li template<typename Derived>
11094*67e74705SXin Li ExprResult TreeTransform<Derived>::
TransformObjCBridgedCastExpr(ObjCBridgedCastExpr * E)11095*67e74705SXin Li TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11096*67e74705SXin Li   TypeSourceInfo *TSInfo
11097*67e74705SXin Li     = getDerived().TransformType(E->getTypeInfoAsWritten());
11098*67e74705SXin Li   if (!TSInfo)
11099*67e74705SXin Li     return ExprError();
11100*67e74705SXin Li 
11101*67e74705SXin Li   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11102*67e74705SXin Li   if (Result.isInvalid())
11103*67e74705SXin Li     return ExprError();
11104*67e74705SXin Li 
11105*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11106*67e74705SXin Li       TSInfo == E->getTypeInfoAsWritten() &&
11107*67e74705SXin Li       Result.get() == E->getSubExpr())
11108*67e74705SXin Li     return E;
11109*67e74705SXin Li 
11110*67e74705SXin Li   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11111*67e74705SXin Li                                       E->getBridgeKeywordLoc(), TSInfo,
11112*67e74705SXin Li                                       Result.get());
11113*67e74705SXin Li }
11114*67e74705SXin Li 
11115*67e74705SXin Li template<typename Derived>
11116*67e74705SXin Li ExprResult
TransformObjCMessageExpr(ObjCMessageExpr * E)11117*67e74705SXin Li TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11118*67e74705SXin Li   // Transform arguments.
11119*67e74705SXin Li   bool ArgChanged = false;
11120*67e74705SXin Li   SmallVector<Expr*, 8> Args;
11121*67e74705SXin Li   Args.reserve(E->getNumArgs());
11122*67e74705SXin Li   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11123*67e74705SXin Li                                   &ArgChanged))
11124*67e74705SXin Li     return ExprError();
11125*67e74705SXin Li 
11126*67e74705SXin Li   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11127*67e74705SXin Li     // Class message: transform the receiver type.
11128*67e74705SXin Li     TypeSourceInfo *ReceiverTypeInfo
11129*67e74705SXin Li       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11130*67e74705SXin Li     if (!ReceiverTypeInfo)
11131*67e74705SXin Li       return ExprError();
11132*67e74705SXin Li 
11133*67e74705SXin Li     // If nothing changed, just retain the existing message send.
11134*67e74705SXin Li     if (!getDerived().AlwaysRebuild() &&
11135*67e74705SXin Li         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11136*67e74705SXin Li       return SemaRef.MaybeBindToTemporary(E);
11137*67e74705SXin Li 
11138*67e74705SXin Li     // Build a new class message send.
11139*67e74705SXin Li     SmallVector<SourceLocation, 16> SelLocs;
11140*67e74705SXin Li     E->getSelectorLocs(SelLocs);
11141*67e74705SXin Li     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11142*67e74705SXin Li                                                E->getSelector(),
11143*67e74705SXin Li                                                SelLocs,
11144*67e74705SXin Li                                                E->getMethodDecl(),
11145*67e74705SXin Li                                                E->getLeftLoc(),
11146*67e74705SXin Li                                                Args,
11147*67e74705SXin Li                                                E->getRightLoc());
11148*67e74705SXin Li   }
11149*67e74705SXin Li   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11150*67e74705SXin Li            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11151*67e74705SXin Li     // Build a new class message send to 'super'.
11152*67e74705SXin Li     SmallVector<SourceLocation, 16> SelLocs;
11153*67e74705SXin Li     E->getSelectorLocs(SelLocs);
11154*67e74705SXin Li     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11155*67e74705SXin Li                                                E->getSelector(),
11156*67e74705SXin Li                                                SelLocs,
11157*67e74705SXin Li                                                E->getReceiverType(),
11158*67e74705SXin Li                                                E->getMethodDecl(),
11159*67e74705SXin Li                                                E->getLeftLoc(),
11160*67e74705SXin Li                                                Args,
11161*67e74705SXin Li                                                E->getRightLoc());
11162*67e74705SXin Li   }
11163*67e74705SXin Li 
11164*67e74705SXin Li   // Instance message: transform the receiver
11165*67e74705SXin Li   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11166*67e74705SXin Li          "Only class and instance messages may be instantiated");
11167*67e74705SXin Li   ExprResult Receiver
11168*67e74705SXin Li     = getDerived().TransformExpr(E->getInstanceReceiver());
11169*67e74705SXin Li   if (Receiver.isInvalid())
11170*67e74705SXin Li     return ExprError();
11171*67e74705SXin Li 
11172*67e74705SXin Li   // If nothing changed, just retain the existing message send.
11173*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11174*67e74705SXin Li       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11175*67e74705SXin Li     return SemaRef.MaybeBindToTemporary(E);
11176*67e74705SXin Li 
11177*67e74705SXin Li   // Build a new instance message send.
11178*67e74705SXin Li   SmallVector<SourceLocation, 16> SelLocs;
11179*67e74705SXin Li   E->getSelectorLocs(SelLocs);
11180*67e74705SXin Li   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11181*67e74705SXin Li                                              E->getSelector(),
11182*67e74705SXin Li                                              SelLocs,
11183*67e74705SXin Li                                              E->getMethodDecl(),
11184*67e74705SXin Li                                              E->getLeftLoc(),
11185*67e74705SXin Li                                              Args,
11186*67e74705SXin Li                                              E->getRightLoc());
11187*67e74705SXin Li }
11188*67e74705SXin Li 
11189*67e74705SXin Li template<typename Derived>
11190*67e74705SXin Li ExprResult
TransformObjCSelectorExpr(ObjCSelectorExpr * E)11191*67e74705SXin Li TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11192*67e74705SXin Li   return E;
11193*67e74705SXin Li }
11194*67e74705SXin Li 
11195*67e74705SXin Li template<typename Derived>
11196*67e74705SXin Li ExprResult
TransformObjCProtocolExpr(ObjCProtocolExpr * E)11197*67e74705SXin Li TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11198*67e74705SXin Li   return E;
11199*67e74705SXin Li }
11200*67e74705SXin Li 
11201*67e74705SXin Li template<typename Derived>
11202*67e74705SXin Li ExprResult
TransformObjCIvarRefExpr(ObjCIvarRefExpr * E)11203*67e74705SXin Li TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11204*67e74705SXin Li   // Transform the base expression.
11205*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
11206*67e74705SXin Li   if (Base.isInvalid())
11207*67e74705SXin Li     return ExprError();
11208*67e74705SXin Li 
11209*67e74705SXin Li   // We don't need to transform the ivar; it will never change.
11210*67e74705SXin Li 
11211*67e74705SXin Li   // If nothing changed, just retain the existing expression.
11212*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11213*67e74705SXin Li       Base.get() == E->getBase())
11214*67e74705SXin Li     return E;
11215*67e74705SXin Li 
11216*67e74705SXin Li   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11217*67e74705SXin Li                                              E->getLocation(),
11218*67e74705SXin Li                                              E->isArrow(), E->isFreeIvar());
11219*67e74705SXin Li }
11220*67e74705SXin Li 
11221*67e74705SXin Li template<typename Derived>
11222*67e74705SXin Li ExprResult
TransformObjCPropertyRefExpr(ObjCPropertyRefExpr * E)11223*67e74705SXin Li TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11224*67e74705SXin Li   // 'super' and types never change. Property never changes. Just
11225*67e74705SXin Li   // retain the existing expression.
11226*67e74705SXin Li   if (!E->isObjectReceiver())
11227*67e74705SXin Li     return E;
11228*67e74705SXin Li 
11229*67e74705SXin Li   // Transform the base expression.
11230*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
11231*67e74705SXin Li   if (Base.isInvalid())
11232*67e74705SXin Li     return ExprError();
11233*67e74705SXin Li 
11234*67e74705SXin Li   // We don't need to transform the property; it will never change.
11235*67e74705SXin Li 
11236*67e74705SXin Li   // If nothing changed, just retain the existing expression.
11237*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11238*67e74705SXin Li       Base.get() == E->getBase())
11239*67e74705SXin Li     return E;
11240*67e74705SXin Li 
11241*67e74705SXin Li   if (E->isExplicitProperty())
11242*67e74705SXin Li     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11243*67e74705SXin Li                                                    E->getExplicitProperty(),
11244*67e74705SXin Li                                                    E->getLocation());
11245*67e74705SXin Li 
11246*67e74705SXin Li   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
11247*67e74705SXin Li                                                  SemaRef.Context.PseudoObjectTy,
11248*67e74705SXin Li                                                  E->getImplicitPropertyGetter(),
11249*67e74705SXin Li                                                  E->getImplicitPropertySetter(),
11250*67e74705SXin Li                                                  E->getLocation());
11251*67e74705SXin Li }
11252*67e74705SXin Li 
11253*67e74705SXin Li template<typename Derived>
11254*67e74705SXin Li ExprResult
TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)11255*67e74705SXin Li TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
11256*67e74705SXin Li   // Transform the base expression.
11257*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
11258*67e74705SXin Li   if (Base.isInvalid())
11259*67e74705SXin Li     return ExprError();
11260*67e74705SXin Li 
11261*67e74705SXin Li   // Transform the key expression.
11262*67e74705SXin Li   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
11263*67e74705SXin Li   if (Key.isInvalid())
11264*67e74705SXin Li     return ExprError();
11265*67e74705SXin Li 
11266*67e74705SXin Li   // If nothing changed, just retain the existing expression.
11267*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11268*67e74705SXin Li       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
11269*67e74705SXin Li     return E;
11270*67e74705SXin Li 
11271*67e74705SXin Li   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
11272*67e74705SXin Li                                                   Base.get(), Key.get(),
11273*67e74705SXin Li                                                   E->getAtIndexMethodDecl(),
11274*67e74705SXin Li                                                   E->setAtIndexMethodDecl());
11275*67e74705SXin Li }
11276*67e74705SXin Li 
11277*67e74705SXin Li template<typename Derived>
11278*67e74705SXin Li ExprResult
TransformObjCIsaExpr(ObjCIsaExpr * E)11279*67e74705SXin Li TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
11280*67e74705SXin Li   // Transform the base expression.
11281*67e74705SXin Li   ExprResult Base = getDerived().TransformExpr(E->getBase());
11282*67e74705SXin Li   if (Base.isInvalid())
11283*67e74705SXin Li     return ExprError();
11284*67e74705SXin Li 
11285*67e74705SXin Li   // If nothing changed, just retain the existing expression.
11286*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11287*67e74705SXin Li       Base.get() == E->getBase())
11288*67e74705SXin Li     return E;
11289*67e74705SXin Li 
11290*67e74705SXin Li   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
11291*67e74705SXin Li                                          E->getOpLoc(),
11292*67e74705SXin Li                                          E->isArrow());
11293*67e74705SXin Li }
11294*67e74705SXin Li 
11295*67e74705SXin Li template<typename Derived>
11296*67e74705SXin Li ExprResult
TransformShuffleVectorExpr(ShuffleVectorExpr * E)11297*67e74705SXin Li TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
11298*67e74705SXin Li   bool ArgumentChanged = false;
11299*67e74705SXin Li   SmallVector<Expr*, 8> SubExprs;
11300*67e74705SXin Li   SubExprs.reserve(E->getNumSubExprs());
11301*67e74705SXin Li   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11302*67e74705SXin Li                                   SubExprs, &ArgumentChanged))
11303*67e74705SXin Li     return ExprError();
11304*67e74705SXin Li 
11305*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11306*67e74705SXin Li       !ArgumentChanged)
11307*67e74705SXin Li     return E;
11308*67e74705SXin Li 
11309*67e74705SXin Li   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
11310*67e74705SXin Li                                                SubExprs,
11311*67e74705SXin Li                                                E->getRParenLoc());
11312*67e74705SXin Li }
11313*67e74705SXin Li 
11314*67e74705SXin Li template<typename Derived>
11315*67e74705SXin Li ExprResult
TransformConvertVectorExpr(ConvertVectorExpr * E)11316*67e74705SXin Li TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
11317*67e74705SXin Li   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
11318*67e74705SXin Li   if (SrcExpr.isInvalid())
11319*67e74705SXin Li     return ExprError();
11320*67e74705SXin Li 
11321*67e74705SXin Li   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11322*67e74705SXin Li   if (!Type)
11323*67e74705SXin Li     return ExprError();
11324*67e74705SXin Li 
11325*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11326*67e74705SXin Li       Type == E->getTypeSourceInfo() &&
11327*67e74705SXin Li       SrcExpr.get() == E->getSrcExpr())
11328*67e74705SXin Li     return E;
11329*67e74705SXin Li 
11330*67e74705SXin Li   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
11331*67e74705SXin Li                                                SrcExpr.get(), Type,
11332*67e74705SXin Li                                                E->getRParenLoc());
11333*67e74705SXin Li }
11334*67e74705SXin Li 
11335*67e74705SXin Li template<typename Derived>
11336*67e74705SXin Li ExprResult
TransformBlockExpr(BlockExpr * E)11337*67e74705SXin Li TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
11338*67e74705SXin Li   BlockDecl *oldBlock = E->getBlockDecl();
11339*67e74705SXin Li 
11340*67e74705SXin Li   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
11341*67e74705SXin Li   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
11342*67e74705SXin Li 
11343*67e74705SXin Li   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
11344*67e74705SXin Li   blockScope->TheDecl->setBlockMissingReturnType(
11345*67e74705SXin Li                          oldBlock->blockMissingReturnType());
11346*67e74705SXin Li 
11347*67e74705SXin Li   SmallVector<ParmVarDecl*, 4> params;
11348*67e74705SXin Li   SmallVector<QualType, 4> paramTypes;
11349*67e74705SXin Li 
11350*67e74705SXin Li   const FunctionProtoType *exprFunctionType = E->getFunctionType();
11351*67e74705SXin Li 
11352*67e74705SXin Li   // Parameter substitution.
11353*67e74705SXin Li   Sema::ExtParameterInfoBuilder extParamInfos;
11354*67e74705SXin Li   if (getDerived().TransformFunctionTypeParams(
11355*67e74705SXin Li           E->getCaretLocation(), oldBlock->parameters(), nullptr,
11356*67e74705SXin Li           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
11357*67e74705SXin Li           extParamInfos)) {
11358*67e74705SXin Li     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11359*67e74705SXin Li     return ExprError();
11360*67e74705SXin Li   }
11361*67e74705SXin Li 
11362*67e74705SXin Li   QualType exprResultType =
11363*67e74705SXin Li       getDerived().TransformType(exprFunctionType->getReturnType());
11364*67e74705SXin Li 
11365*67e74705SXin Li   auto epi = exprFunctionType->getExtProtoInfo();
11366*67e74705SXin Li   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
11367*67e74705SXin Li 
11368*67e74705SXin Li   QualType functionType =
11369*67e74705SXin Li     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
11370*67e74705SXin Li   blockScope->FunctionType = functionType;
11371*67e74705SXin Li 
11372*67e74705SXin Li   // Set the parameters on the block decl.
11373*67e74705SXin Li   if (!params.empty())
11374*67e74705SXin Li     blockScope->TheDecl->setParams(params);
11375*67e74705SXin Li 
11376*67e74705SXin Li   if (!oldBlock->blockMissingReturnType()) {
11377*67e74705SXin Li     blockScope->HasImplicitReturnType = false;
11378*67e74705SXin Li     blockScope->ReturnType = exprResultType;
11379*67e74705SXin Li   }
11380*67e74705SXin Li 
11381*67e74705SXin Li   // Transform the body
11382*67e74705SXin Li   StmtResult body = getDerived().TransformStmt(E->getBody());
11383*67e74705SXin Li   if (body.isInvalid()) {
11384*67e74705SXin Li     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
11385*67e74705SXin Li     return ExprError();
11386*67e74705SXin Li   }
11387*67e74705SXin Li 
11388*67e74705SXin Li #ifndef NDEBUG
11389*67e74705SXin Li   // In builds with assertions, make sure that we captured everything we
11390*67e74705SXin Li   // captured before.
11391*67e74705SXin Li   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
11392*67e74705SXin Li     for (const auto &I : oldBlock->captures()) {
11393*67e74705SXin Li       VarDecl *oldCapture = I.getVariable();
11394*67e74705SXin Li 
11395*67e74705SXin Li       // Ignore parameter packs.
11396*67e74705SXin Li       if (isa<ParmVarDecl>(oldCapture) &&
11397*67e74705SXin Li           cast<ParmVarDecl>(oldCapture)->isParameterPack())
11398*67e74705SXin Li         continue;
11399*67e74705SXin Li 
11400*67e74705SXin Li       VarDecl *newCapture =
11401*67e74705SXin Li         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
11402*67e74705SXin Li                                                  oldCapture));
11403*67e74705SXin Li       assert(blockScope->CaptureMap.count(newCapture));
11404*67e74705SXin Li     }
11405*67e74705SXin Li     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
11406*67e74705SXin Li   }
11407*67e74705SXin Li #endif
11408*67e74705SXin Li 
11409*67e74705SXin Li   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
11410*67e74705SXin Li                                     /*Scope=*/nullptr);
11411*67e74705SXin Li }
11412*67e74705SXin Li 
11413*67e74705SXin Li template<typename Derived>
11414*67e74705SXin Li ExprResult
TransformAsTypeExpr(AsTypeExpr * E)11415*67e74705SXin Li TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
11416*67e74705SXin Li   llvm_unreachable("Cannot transform asType expressions yet");
11417*67e74705SXin Li }
11418*67e74705SXin Li 
11419*67e74705SXin Li template<typename Derived>
11420*67e74705SXin Li ExprResult
TransformAtomicExpr(AtomicExpr * E)11421*67e74705SXin Li TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
11422*67e74705SXin Li   QualType RetTy = getDerived().TransformType(E->getType());
11423*67e74705SXin Li   bool ArgumentChanged = false;
11424*67e74705SXin Li   SmallVector<Expr*, 8> SubExprs;
11425*67e74705SXin Li   SubExprs.reserve(E->getNumSubExprs());
11426*67e74705SXin Li   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
11427*67e74705SXin Li                                   SubExprs, &ArgumentChanged))
11428*67e74705SXin Li     return ExprError();
11429*67e74705SXin Li 
11430*67e74705SXin Li   if (!getDerived().AlwaysRebuild() &&
11431*67e74705SXin Li       !ArgumentChanged)
11432*67e74705SXin Li     return E;
11433*67e74705SXin Li 
11434*67e74705SXin Li   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
11435*67e74705SXin Li                                         RetTy, E->getOp(), E->getRParenLoc());
11436*67e74705SXin Li }
11437*67e74705SXin Li 
11438*67e74705SXin Li //===----------------------------------------------------------------------===//
11439*67e74705SXin Li // Type reconstruction
11440*67e74705SXin Li //===----------------------------------------------------------------------===//
11441*67e74705SXin Li 
11442*67e74705SXin Li template<typename Derived>
RebuildPointerType(QualType PointeeType,SourceLocation Star)11443*67e74705SXin Li QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
11444*67e74705SXin Li                                                     SourceLocation Star) {
11445*67e74705SXin Li   return SemaRef.BuildPointerType(PointeeType, Star,
11446*67e74705SXin Li                                   getDerived().getBaseEntity());
11447*67e74705SXin Li }
11448*67e74705SXin Li 
11449*67e74705SXin Li template<typename Derived>
RebuildBlockPointerType(QualType PointeeType,SourceLocation Star)11450*67e74705SXin Li QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
11451*67e74705SXin Li                                                          SourceLocation Star) {
11452*67e74705SXin Li   return SemaRef.BuildBlockPointerType(PointeeType, Star,
11453*67e74705SXin Li                                        getDerived().getBaseEntity());
11454*67e74705SXin Li }
11455*67e74705SXin Li 
11456*67e74705SXin Li template<typename Derived>
11457*67e74705SXin Li QualType
RebuildReferenceType(QualType ReferentType,bool WrittenAsLValue,SourceLocation Sigil)11458*67e74705SXin Li TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
11459*67e74705SXin Li                                              bool WrittenAsLValue,
11460*67e74705SXin Li                                              SourceLocation Sigil) {
11461*67e74705SXin Li   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
11462*67e74705SXin Li                                     Sigil, getDerived().getBaseEntity());
11463*67e74705SXin Li }
11464*67e74705SXin Li 
11465*67e74705SXin Li template<typename Derived>
11466*67e74705SXin Li QualType
RebuildMemberPointerType(QualType PointeeType,QualType ClassType,SourceLocation Sigil)11467*67e74705SXin Li TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
11468*67e74705SXin Li                                                  QualType ClassType,
11469*67e74705SXin Li                                                  SourceLocation Sigil) {
11470*67e74705SXin Li   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
11471*67e74705SXin Li                                         getDerived().getBaseEntity());
11472*67e74705SXin Li }
11473*67e74705SXin Li 
11474*67e74705SXin Li template<typename Derived>
RebuildObjCObjectType(QualType BaseType,SourceLocation Loc,SourceLocation TypeArgsLAngleLoc,ArrayRef<TypeSourceInfo * > TypeArgs,SourceLocation TypeArgsRAngleLoc,SourceLocation ProtocolLAngleLoc,ArrayRef<ObjCProtocolDecl * > Protocols,ArrayRef<SourceLocation> ProtocolLocs,SourceLocation ProtocolRAngleLoc)11475*67e74705SXin Li QualType TreeTransform<Derived>::RebuildObjCObjectType(
11476*67e74705SXin Li            QualType BaseType,
11477*67e74705SXin Li            SourceLocation Loc,
11478*67e74705SXin Li            SourceLocation TypeArgsLAngleLoc,
11479*67e74705SXin Li            ArrayRef<TypeSourceInfo *> TypeArgs,
11480*67e74705SXin Li            SourceLocation TypeArgsRAngleLoc,
11481*67e74705SXin Li            SourceLocation ProtocolLAngleLoc,
11482*67e74705SXin Li            ArrayRef<ObjCProtocolDecl *> Protocols,
11483*67e74705SXin Li            ArrayRef<SourceLocation> ProtocolLocs,
11484*67e74705SXin Li            SourceLocation ProtocolRAngleLoc) {
11485*67e74705SXin Li   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
11486*67e74705SXin Li                                      TypeArgs, TypeArgsRAngleLoc,
11487*67e74705SXin Li                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
11488*67e74705SXin Li                                      ProtocolRAngleLoc,
11489*67e74705SXin Li                                      /*FailOnError=*/true);
11490*67e74705SXin Li }
11491*67e74705SXin Li 
11492*67e74705SXin Li template<typename Derived>
RebuildObjCObjectPointerType(QualType PointeeType,SourceLocation Star)11493*67e74705SXin Li QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
11494*67e74705SXin Li            QualType PointeeType,
11495*67e74705SXin Li            SourceLocation Star) {
11496*67e74705SXin Li   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
11497*67e74705SXin Li }
11498*67e74705SXin Li 
11499*67e74705SXin Li template<typename Derived>
11500*67e74705SXin Li QualType
RebuildArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt * Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)11501*67e74705SXin Li TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
11502*67e74705SXin Li                                          ArrayType::ArraySizeModifier SizeMod,
11503*67e74705SXin Li                                          const llvm::APInt *Size,
11504*67e74705SXin Li                                          Expr *SizeExpr,
11505*67e74705SXin Li                                          unsigned IndexTypeQuals,
11506*67e74705SXin Li                                          SourceRange BracketsRange) {
11507*67e74705SXin Li   if (SizeExpr || !Size)
11508*67e74705SXin Li     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
11509*67e74705SXin Li                                   IndexTypeQuals, BracketsRange,
11510*67e74705SXin Li                                   getDerived().getBaseEntity());
11511*67e74705SXin Li 
11512*67e74705SXin Li   QualType Types[] = {
11513*67e74705SXin Li     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
11514*67e74705SXin Li     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
11515*67e74705SXin Li     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
11516*67e74705SXin Li   };
11517*67e74705SXin Li   const unsigned NumTypes = llvm::array_lengthof(Types);
11518*67e74705SXin Li   QualType SizeType;
11519*67e74705SXin Li   for (unsigned I = 0; I != NumTypes; ++I)
11520*67e74705SXin Li     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
11521*67e74705SXin Li       SizeType = Types[I];
11522*67e74705SXin Li       break;
11523*67e74705SXin Li     }
11524*67e74705SXin Li 
11525*67e74705SXin Li   // Note that we can return a VariableArrayType here in the case where
11526*67e74705SXin Li   // the element type was a dependent VariableArrayType.
11527*67e74705SXin Li   IntegerLiteral *ArraySize
11528*67e74705SXin Li       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
11529*67e74705SXin Li                                /*FIXME*/BracketsRange.getBegin());
11530*67e74705SXin Li   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
11531*67e74705SXin Li                                 IndexTypeQuals, BracketsRange,
11532*67e74705SXin Li                                 getDerived().getBaseEntity());
11533*67e74705SXin Li }
11534*67e74705SXin Li 
11535*67e74705SXin Li template<typename Derived>
11536*67e74705SXin Li QualType
RebuildConstantArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt & Size,unsigned IndexTypeQuals,SourceRange BracketsRange)11537*67e74705SXin Li TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
11538*67e74705SXin Li                                                  ArrayType::ArraySizeModifier SizeMod,
11539*67e74705SXin Li                                                  const llvm::APInt &Size,
11540*67e74705SXin Li                                                  unsigned IndexTypeQuals,
11541*67e74705SXin Li                                                  SourceRange BracketsRange) {
11542*67e74705SXin Li   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
11543*67e74705SXin Li                                         IndexTypeQuals, BracketsRange);
11544*67e74705SXin Li }
11545*67e74705SXin Li 
11546*67e74705SXin Li template<typename Derived>
11547*67e74705SXin Li QualType
RebuildIncompleteArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,unsigned IndexTypeQuals,SourceRange BracketsRange)11548*67e74705SXin Li TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
11549*67e74705SXin Li                                           ArrayType::ArraySizeModifier SizeMod,
11550*67e74705SXin Li                                                  unsigned IndexTypeQuals,
11551*67e74705SXin Li                                                    SourceRange BracketsRange) {
11552*67e74705SXin Li   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
11553*67e74705SXin Li                                        IndexTypeQuals, BracketsRange);
11554*67e74705SXin Li }
11555*67e74705SXin Li 
11556*67e74705SXin Li template<typename Derived>
11557*67e74705SXin Li QualType
RebuildVariableArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)11558*67e74705SXin Li TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
11559*67e74705SXin Li                                           ArrayType::ArraySizeModifier SizeMod,
11560*67e74705SXin Li                                                  Expr *SizeExpr,
11561*67e74705SXin Li                                                  unsigned IndexTypeQuals,
11562*67e74705SXin Li                                                  SourceRange BracketsRange) {
11563*67e74705SXin Li   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11564*67e74705SXin Li                                        SizeExpr,
11565*67e74705SXin Li                                        IndexTypeQuals, BracketsRange);
11566*67e74705SXin Li }
11567*67e74705SXin Li 
11568*67e74705SXin Li template<typename Derived>
11569*67e74705SXin Li QualType
RebuildDependentSizedArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)11570*67e74705SXin Li TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
11571*67e74705SXin Li                                           ArrayType::ArraySizeModifier SizeMod,
11572*67e74705SXin Li                                                        Expr *SizeExpr,
11573*67e74705SXin Li                                                        unsigned IndexTypeQuals,
11574*67e74705SXin Li                                                    SourceRange BracketsRange) {
11575*67e74705SXin Li   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
11576*67e74705SXin Li                                        SizeExpr,
11577*67e74705SXin Li                                        IndexTypeQuals, BracketsRange);
11578*67e74705SXin Li }
11579*67e74705SXin Li 
11580*67e74705SXin Li template<typename Derived>
RebuildVectorType(QualType ElementType,unsigned NumElements,VectorType::VectorKind VecKind)11581*67e74705SXin Li QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
11582*67e74705SXin Li                                                unsigned NumElements,
11583*67e74705SXin Li                                                VectorType::VectorKind VecKind) {
11584*67e74705SXin Li   // FIXME: semantic checking!
11585*67e74705SXin Li   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
11586*67e74705SXin Li }
11587*67e74705SXin Li 
11588*67e74705SXin Li template<typename Derived>
RebuildExtVectorType(QualType ElementType,unsigned NumElements,SourceLocation AttributeLoc)11589*67e74705SXin Li QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
11590*67e74705SXin Li                                                       unsigned NumElements,
11591*67e74705SXin Li                                                  SourceLocation AttributeLoc) {
11592*67e74705SXin Li   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
11593*67e74705SXin Li                           NumElements, true);
11594*67e74705SXin Li   IntegerLiteral *VectorSize
11595*67e74705SXin Li     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
11596*67e74705SXin Li                              AttributeLoc);
11597*67e74705SXin Li   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
11598*67e74705SXin Li }
11599*67e74705SXin Li 
11600*67e74705SXin Li template<typename Derived>
11601*67e74705SXin Li QualType
RebuildDependentSizedExtVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc)11602*67e74705SXin Li TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
11603*67e74705SXin Li                                                            Expr *SizeExpr,
11604*67e74705SXin Li                                                   SourceLocation AttributeLoc) {
11605*67e74705SXin Li   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
11606*67e74705SXin Li }
11607*67e74705SXin Li 
11608*67e74705SXin Li template<typename Derived>
RebuildFunctionProtoType(QualType T,MutableArrayRef<QualType> ParamTypes,const FunctionProtoType::ExtProtoInfo & EPI)11609*67e74705SXin Li QualType TreeTransform<Derived>::RebuildFunctionProtoType(
11610*67e74705SXin Li     QualType T,
11611*67e74705SXin Li     MutableArrayRef<QualType> ParamTypes,
11612*67e74705SXin Li     const FunctionProtoType::ExtProtoInfo &EPI) {
11613*67e74705SXin Li   return SemaRef.BuildFunctionType(T, ParamTypes,
11614*67e74705SXin Li                                    getDerived().getBaseLocation(),
11615*67e74705SXin Li                                    getDerived().getBaseEntity(),
11616*67e74705SXin Li                                    EPI);
11617*67e74705SXin Li }
11618*67e74705SXin Li 
11619*67e74705SXin Li template<typename Derived>
RebuildFunctionNoProtoType(QualType T)11620*67e74705SXin Li QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
11621*67e74705SXin Li   return SemaRef.Context.getFunctionNoProtoType(T);
11622*67e74705SXin Li }
11623*67e74705SXin Li 
11624*67e74705SXin Li template<typename Derived>
RebuildUnresolvedUsingType(Decl * D)11625*67e74705SXin Li QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
11626*67e74705SXin Li   assert(D && "no decl found");
11627*67e74705SXin Li   if (D->isInvalidDecl()) return QualType();
11628*67e74705SXin Li 
11629*67e74705SXin Li   // FIXME: Doesn't account for ObjCInterfaceDecl!
11630*67e74705SXin Li   TypeDecl *Ty;
11631*67e74705SXin Li   if (isa<UsingDecl>(D)) {
11632*67e74705SXin Li     UsingDecl *Using = cast<UsingDecl>(D);
11633*67e74705SXin Li     assert(Using->hasTypename() &&
11634*67e74705SXin Li            "UnresolvedUsingTypenameDecl transformed to non-typename using");
11635*67e74705SXin Li 
11636*67e74705SXin Li     // A valid resolved using typename decl points to exactly one type decl.
11637*67e74705SXin Li     assert(++Using->shadow_begin() == Using->shadow_end());
11638*67e74705SXin Li     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
11639*67e74705SXin Li 
11640*67e74705SXin Li   } else {
11641*67e74705SXin Li     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
11642*67e74705SXin Li            "UnresolvedUsingTypenameDecl transformed to non-using decl");
11643*67e74705SXin Li     Ty = cast<UnresolvedUsingTypenameDecl>(D);
11644*67e74705SXin Li   }
11645*67e74705SXin Li 
11646*67e74705SXin Li   return SemaRef.Context.getTypeDeclType(Ty);
11647*67e74705SXin Li }
11648*67e74705SXin Li 
11649*67e74705SXin Li template<typename Derived>
RebuildTypeOfExprType(Expr * E,SourceLocation Loc)11650*67e74705SXin Li QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
11651*67e74705SXin Li                                                        SourceLocation Loc) {
11652*67e74705SXin Li   return SemaRef.BuildTypeofExprType(E, Loc);
11653*67e74705SXin Li }
11654*67e74705SXin Li 
11655*67e74705SXin Li template<typename Derived>
RebuildTypeOfType(QualType Underlying)11656*67e74705SXin Li QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
11657*67e74705SXin Li   return SemaRef.Context.getTypeOfType(Underlying);
11658*67e74705SXin Li }
11659*67e74705SXin Li 
11660*67e74705SXin Li template<typename Derived>
RebuildDecltypeType(Expr * E,SourceLocation Loc)11661*67e74705SXin Li QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
11662*67e74705SXin Li                                                      SourceLocation Loc) {
11663*67e74705SXin Li   return SemaRef.BuildDecltypeType(E, Loc);
11664*67e74705SXin Li }
11665*67e74705SXin Li 
11666*67e74705SXin Li template<typename Derived>
RebuildUnaryTransformType(QualType BaseType,UnaryTransformType::UTTKind UKind,SourceLocation Loc)11667*67e74705SXin Li QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
11668*67e74705SXin Li                                             UnaryTransformType::UTTKind UKind,
11669*67e74705SXin Li                                             SourceLocation Loc) {
11670*67e74705SXin Li   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
11671*67e74705SXin Li }
11672*67e74705SXin Li 
11673*67e74705SXin Li template<typename Derived>
RebuildTemplateSpecializationType(TemplateName Template,SourceLocation TemplateNameLoc,TemplateArgumentListInfo & TemplateArgs)11674*67e74705SXin Li QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
11675*67e74705SXin Li                                                       TemplateName Template,
11676*67e74705SXin Li                                              SourceLocation TemplateNameLoc,
11677*67e74705SXin Li                                      TemplateArgumentListInfo &TemplateArgs) {
11678*67e74705SXin Li   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
11679*67e74705SXin Li }
11680*67e74705SXin Li 
11681*67e74705SXin Li template<typename Derived>
RebuildAtomicType(QualType ValueType,SourceLocation KWLoc)11682*67e74705SXin Li QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
11683*67e74705SXin Li                                                    SourceLocation KWLoc) {
11684*67e74705SXin Li   return SemaRef.BuildAtomicType(ValueType, KWLoc);
11685*67e74705SXin Li }
11686*67e74705SXin Li 
11687*67e74705SXin Li template<typename Derived>
RebuildPipeType(QualType ValueType,SourceLocation KWLoc)11688*67e74705SXin Li QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
11689*67e74705SXin Li                                                    SourceLocation KWLoc) {
11690*67e74705SXin Li   return SemaRef.BuildPipeType(ValueType, KWLoc);
11691*67e74705SXin Li }
11692*67e74705SXin Li 
11693*67e74705SXin Li template<typename Derived>
11694*67e74705SXin Li TemplateName
RebuildTemplateName(CXXScopeSpec & SS,bool TemplateKW,TemplateDecl * Template)11695*67e74705SXin Li TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11696*67e74705SXin Li                                             bool TemplateKW,
11697*67e74705SXin Li                                             TemplateDecl *Template) {
11698*67e74705SXin Li   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
11699*67e74705SXin Li                                                   Template);
11700*67e74705SXin Li }
11701*67e74705SXin Li 
11702*67e74705SXin Li template<typename Derived>
11703*67e74705SXin Li TemplateName
RebuildTemplateName(CXXScopeSpec & SS,const IdentifierInfo & Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)11704*67e74705SXin Li TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11705*67e74705SXin Li                                             const IdentifierInfo &Name,
11706*67e74705SXin Li                                             SourceLocation NameLoc,
11707*67e74705SXin Li                                             QualType ObjectType,
11708*67e74705SXin Li                                             NamedDecl *FirstQualifierInScope) {
11709*67e74705SXin Li   UnqualifiedId TemplateName;
11710*67e74705SXin Li   TemplateName.setIdentifier(&Name, NameLoc);
11711*67e74705SXin Li   Sema::TemplateTy Template;
11712*67e74705SXin Li   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
11713*67e74705SXin Li   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
11714*67e74705SXin Li                                        SS, TemplateKWLoc, TemplateName,
11715*67e74705SXin Li                                        ParsedType::make(ObjectType),
11716*67e74705SXin Li                                        /*EnteringContext=*/false,
11717*67e74705SXin Li                                        Template);
11718*67e74705SXin Li   return Template.get();
11719*67e74705SXin Li }
11720*67e74705SXin Li 
11721*67e74705SXin Li template<typename Derived>
11722*67e74705SXin Li TemplateName
RebuildTemplateName(CXXScopeSpec & SS,OverloadedOperatorKind Operator,SourceLocation NameLoc,QualType ObjectType)11723*67e74705SXin Li TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
11724*67e74705SXin Li                                             OverloadedOperatorKind Operator,
11725*67e74705SXin Li                                             SourceLocation NameLoc,
11726*67e74705SXin Li                                             QualType ObjectType) {
11727*67e74705SXin Li   UnqualifiedId Name;
11728*67e74705SXin Li   // FIXME: Bogus location information.
11729*67e74705SXin Li   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
11730*67e74705SXin Li   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
11731*67e74705SXin Li   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
11732*67e74705SXin Li   Sema::TemplateTy Template;
11733*67e74705SXin Li   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
11734*67e74705SXin Li                                        SS, TemplateKWLoc, Name,
11735*67e74705SXin Li                                        ParsedType::make(ObjectType),
11736*67e74705SXin Li                                        /*EnteringContext=*/false,
11737*67e74705SXin Li                                        Template);
11738*67e74705SXin Li   return Template.get();
11739*67e74705SXin Li }
11740*67e74705SXin Li 
11741*67e74705SXin Li template<typename Derived>
11742*67e74705SXin Li ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,SourceLocation OpLoc,Expr * OrigCallee,Expr * First,Expr * Second)11743*67e74705SXin Li TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
11744*67e74705SXin Li                                                    SourceLocation OpLoc,
11745*67e74705SXin Li                                                    Expr *OrigCallee,
11746*67e74705SXin Li                                                    Expr *First,
11747*67e74705SXin Li                                                    Expr *Second) {
11748*67e74705SXin Li   Expr *Callee = OrigCallee->IgnoreParenCasts();
11749*67e74705SXin Li   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
11750*67e74705SXin Li 
11751*67e74705SXin Li   if (First->getObjectKind() == OK_ObjCProperty) {
11752*67e74705SXin Li     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
11753*67e74705SXin Li     if (BinaryOperator::isAssignmentOp(Opc))
11754*67e74705SXin Li       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
11755*67e74705SXin Li                                                  First, Second);
11756*67e74705SXin Li     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
11757*67e74705SXin Li     if (Result.isInvalid())
11758*67e74705SXin Li       return ExprError();
11759*67e74705SXin Li     First = Result.get();
11760*67e74705SXin Li   }
11761*67e74705SXin Li 
11762*67e74705SXin Li   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
11763*67e74705SXin Li     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
11764*67e74705SXin Li     if (Result.isInvalid())
11765*67e74705SXin Li       return ExprError();
11766*67e74705SXin Li     Second = Result.get();
11767*67e74705SXin Li   }
11768*67e74705SXin Li 
11769*67e74705SXin Li   // Determine whether this should be a builtin operation.
11770*67e74705SXin Li   if (Op == OO_Subscript) {
11771*67e74705SXin Li     if (!First->getType()->isOverloadableType() &&
11772*67e74705SXin Li         !Second->getType()->isOverloadableType())
11773*67e74705SXin Li       return getSema().CreateBuiltinArraySubscriptExpr(First,
11774*67e74705SXin Li                                                        Callee->getLocStart(),
11775*67e74705SXin Li                                                        Second, OpLoc);
11776*67e74705SXin Li   } else if (Op == OO_Arrow) {
11777*67e74705SXin Li     // -> is never a builtin operation.
11778*67e74705SXin Li     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
11779*67e74705SXin Li   } else if (Second == nullptr || isPostIncDec) {
11780*67e74705SXin Li     if (!First->getType()->isOverloadableType()) {
11781*67e74705SXin Li       // The argument is not of overloadable type, so try to create a
11782*67e74705SXin Li       // built-in unary operation.
11783*67e74705SXin Li       UnaryOperatorKind Opc
11784*67e74705SXin Li         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
11785*67e74705SXin Li 
11786*67e74705SXin Li       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
11787*67e74705SXin Li     }
11788*67e74705SXin Li   } else {
11789*67e74705SXin Li     if (!First->getType()->isOverloadableType() &&
11790*67e74705SXin Li         !Second->getType()->isOverloadableType()) {
11791*67e74705SXin Li       // Neither of the arguments is an overloadable type, so try to
11792*67e74705SXin Li       // create a built-in binary operation.
11793*67e74705SXin Li       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
11794*67e74705SXin Li       ExprResult Result
11795*67e74705SXin Li         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
11796*67e74705SXin Li       if (Result.isInvalid())
11797*67e74705SXin Li         return ExprError();
11798*67e74705SXin Li 
11799*67e74705SXin Li       return Result;
11800*67e74705SXin Li     }
11801*67e74705SXin Li   }
11802*67e74705SXin Li 
11803*67e74705SXin Li   // Compute the transformed set of functions (and function templates) to be
11804*67e74705SXin Li   // used during overload resolution.
11805*67e74705SXin Li   UnresolvedSet<16> Functions;
11806*67e74705SXin Li 
11807*67e74705SXin Li   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
11808*67e74705SXin Li     assert(ULE->requiresADL());
11809*67e74705SXin Li     Functions.append(ULE->decls_begin(), ULE->decls_end());
11810*67e74705SXin Li   } else {
11811*67e74705SXin Li     // If we've resolved this to a particular non-member function, just call
11812*67e74705SXin Li     // that function. If we resolved it to a member function,
11813*67e74705SXin Li     // CreateOverloaded* will find that function for us.
11814*67e74705SXin Li     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
11815*67e74705SXin Li     if (!isa<CXXMethodDecl>(ND))
11816*67e74705SXin Li       Functions.addDecl(ND);
11817*67e74705SXin Li   }
11818*67e74705SXin Li 
11819*67e74705SXin Li   // Add any functions found via argument-dependent lookup.
11820*67e74705SXin Li   Expr *Args[2] = { First, Second };
11821*67e74705SXin Li   unsigned NumArgs = 1 + (Second != nullptr);
11822*67e74705SXin Li 
11823*67e74705SXin Li   // Create the overloaded operator invocation for unary operators.
11824*67e74705SXin Li   if (NumArgs == 1 || isPostIncDec) {
11825*67e74705SXin Li     UnaryOperatorKind Opc
11826*67e74705SXin Li       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
11827*67e74705SXin Li     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
11828*67e74705SXin Li   }
11829*67e74705SXin Li 
11830*67e74705SXin Li   if (Op == OO_Subscript) {
11831*67e74705SXin Li     SourceLocation LBrace;
11832*67e74705SXin Li     SourceLocation RBrace;
11833*67e74705SXin Li 
11834*67e74705SXin Li     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
11835*67e74705SXin Li         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
11836*67e74705SXin Li         LBrace = SourceLocation::getFromRawEncoding(
11837*67e74705SXin Li                     NameLoc.CXXOperatorName.BeginOpNameLoc);
11838*67e74705SXin Li         RBrace = SourceLocation::getFromRawEncoding(
11839*67e74705SXin Li                     NameLoc.CXXOperatorName.EndOpNameLoc);
11840*67e74705SXin Li     } else {
11841*67e74705SXin Li         LBrace = Callee->getLocStart();
11842*67e74705SXin Li         RBrace = OpLoc;
11843*67e74705SXin Li     }
11844*67e74705SXin Li 
11845*67e74705SXin Li     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
11846*67e74705SXin Li                                                       First, Second);
11847*67e74705SXin Li   }
11848*67e74705SXin Li 
11849*67e74705SXin Li   // Create the overloaded operator invocation for binary operators.
11850*67e74705SXin Li   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
11851*67e74705SXin Li   ExprResult Result
11852*67e74705SXin Li     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
11853*67e74705SXin Li   if (Result.isInvalid())
11854*67e74705SXin Li     return ExprError();
11855*67e74705SXin Li 
11856*67e74705SXin Li   return Result;
11857*67e74705SXin Li }
11858*67e74705SXin Li 
11859*67e74705SXin Li template<typename Derived>
11860*67e74705SXin Li ExprResult
RebuildCXXPseudoDestructorExpr(Expr * Base,SourceLocation OperatorLoc,bool isArrow,CXXScopeSpec & SS,TypeSourceInfo * ScopeType,SourceLocation CCLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage Destroyed)11861*67e74705SXin Li TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
11862*67e74705SXin Li                                                      SourceLocation OperatorLoc,
11863*67e74705SXin Li                                                        bool isArrow,
11864*67e74705SXin Li                                                        CXXScopeSpec &SS,
11865*67e74705SXin Li                                                      TypeSourceInfo *ScopeType,
11866*67e74705SXin Li                                                        SourceLocation CCLoc,
11867*67e74705SXin Li                                                        SourceLocation TildeLoc,
11868*67e74705SXin Li                                         PseudoDestructorTypeStorage Destroyed) {
11869*67e74705SXin Li   QualType BaseType = Base->getType();
11870*67e74705SXin Li   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
11871*67e74705SXin Li       (!isArrow && !BaseType->getAs<RecordType>()) ||
11872*67e74705SXin Li       (isArrow && BaseType->getAs<PointerType>() &&
11873*67e74705SXin Li        !BaseType->getAs<PointerType>()->getPointeeType()
11874*67e74705SXin Li                                               ->template getAs<RecordType>())){
11875*67e74705SXin Li     // This pseudo-destructor expression is still a pseudo-destructor.
11876*67e74705SXin Li     return SemaRef.BuildPseudoDestructorExpr(
11877*67e74705SXin Li         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
11878*67e74705SXin Li         CCLoc, TildeLoc, Destroyed);
11879*67e74705SXin Li   }
11880*67e74705SXin Li 
11881*67e74705SXin Li   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
11882*67e74705SXin Li   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
11883*67e74705SXin Li                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
11884*67e74705SXin Li   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
11885*67e74705SXin Li   NameInfo.setNamedTypeInfo(DestroyedType);
11886*67e74705SXin Li 
11887*67e74705SXin Li   // The scope type is now known to be a valid nested name specifier
11888*67e74705SXin Li   // component. Tack it on to the end of the nested name specifier.
11889*67e74705SXin Li   if (ScopeType) {
11890*67e74705SXin Li     if (!ScopeType->getType()->getAs<TagType>()) {
11891*67e74705SXin Li       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
11892*67e74705SXin Li                      diag::err_expected_class_or_namespace)
11893*67e74705SXin Li           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
11894*67e74705SXin Li       return ExprError();
11895*67e74705SXin Li     }
11896*67e74705SXin Li     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
11897*67e74705SXin Li               CCLoc);
11898*67e74705SXin Li   }
11899*67e74705SXin Li 
11900*67e74705SXin Li   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
11901*67e74705SXin Li   return getSema().BuildMemberReferenceExpr(Base, BaseType,
11902*67e74705SXin Li                                             OperatorLoc, isArrow,
11903*67e74705SXin Li                                             SS, TemplateKWLoc,
11904*67e74705SXin Li                                             /*FIXME: FirstQualifier*/ nullptr,
11905*67e74705SXin Li                                             NameInfo,
11906*67e74705SXin Li                                             /*TemplateArgs*/ nullptr,
11907*67e74705SXin Li                                             /*S*/nullptr);
11908*67e74705SXin Li }
11909*67e74705SXin Li 
11910*67e74705SXin Li template<typename Derived>
11911*67e74705SXin Li StmtResult
TransformCapturedStmt(CapturedStmt * S)11912*67e74705SXin Li TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
11913*67e74705SXin Li   SourceLocation Loc = S->getLocStart();
11914*67e74705SXin Li   CapturedDecl *CD = S->getCapturedDecl();
11915*67e74705SXin Li   unsigned NumParams = CD->getNumParams();
11916*67e74705SXin Li   unsigned ContextParamPos = CD->getContextParamPosition();
11917*67e74705SXin Li   SmallVector<Sema::CapturedParamNameType, 4> Params;
11918*67e74705SXin Li   for (unsigned I = 0; I < NumParams; ++I) {
11919*67e74705SXin Li     if (I != ContextParamPos) {
11920*67e74705SXin Li       Params.push_back(
11921*67e74705SXin Li              std::make_pair(
11922*67e74705SXin Li                   CD->getParam(I)->getName(),
11923*67e74705SXin Li                   getDerived().TransformType(CD->getParam(I)->getType())));
11924*67e74705SXin Li     } else {
11925*67e74705SXin Li       Params.push_back(std::make_pair(StringRef(), QualType()));
11926*67e74705SXin Li     }
11927*67e74705SXin Li   }
11928*67e74705SXin Li   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
11929*67e74705SXin Li                                      S->getCapturedRegionKind(), Params);
11930*67e74705SXin Li   StmtResult Body;
11931*67e74705SXin Li   {
11932*67e74705SXin Li     Sema::CompoundScopeRAII CompoundScope(getSema());
11933*67e74705SXin Li     Body = getDerived().TransformStmt(S->getCapturedStmt());
11934*67e74705SXin Li   }
11935*67e74705SXin Li 
11936*67e74705SXin Li   if (Body.isInvalid()) {
11937*67e74705SXin Li     getSema().ActOnCapturedRegionError();
11938*67e74705SXin Li     return StmtError();
11939*67e74705SXin Li   }
11940*67e74705SXin Li 
11941*67e74705SXin Li   return getSema().ActOnCapturedRegionEnd(Body.get());
11942*67e74705SXin Li }
11943*67e74705SXin Li 
11944*67e74705SXin Li } // end namespace clang
11945*67e74705SXin Li 
11946*67e74705SXin Li #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
11947