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, ¶ms,
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