1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a semantic tree transformation that takes a given
10 // AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_SEMA_TREETRANSFORM_H
16
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
23 #include "clang/AST/ExprObjC.h"
24 #include "clang/AST/Stmt.h"
25 #include "clang/AST/StmtCXX.h"
26 #include "clang/AST/StmtObjC.h"
27 #include "clang/AST/StmtOpenMP.h"
28 #include "clang/Sema/Designator.h"
29 #include "clang/Sema/Lookup.h"
30 #include "clang/Sema/Ownership.h"
31 #include "clang/Sema/ParsedTemplate.h"
32 #include "clang/Sema/ScopeInfo.h"
33 #include "clang/Sema/SemaDiagnostic.h"
34 #include "clang/Sema/SemaInternal.h"
35 #include "llvm/ADT/ArrayRef.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include <algorithm>
38
39 namespace clang {
40 using namespace sema;
41
42 /// \brief A semantic tree transformation that allows one to transform one
43 /// abstract syntax tree into another.
44 ///
45 /// A new tree transformation is defined by creating a new subclass \c X of
46 /// \c TreeTransform<X> and then overriding certain operations to provide
47 /// behavior specific to that transformation. For example, template
48 /// instantiation is implemented as a tree transformation where the
49 /// transformation of TemplateTypeParmType nodes involves substituting the
50 /// template arguments for their corresponding template parameters; a similar
51 /// transformation is performed for non-type template parameters and
52 /// template template parameters.
53 ///
54 /// This tree-transformation template uses static polymorphism to allow
55 /// subclasses to customize any of its operations. Thus, a subclass can
56 /// override any of the transformation or rebuild operators by providing an
57 /// operation with the same signature as the default implementation. The
58 /// overridding function should not be virtual.
59 ///
60 /// Semantic tree transformations are split into two stages, either of which
61 /// can be replaced by a subclass. The "transform" step transforms an AST node
62 /// or the parts of an AST node using the various transformation functions,
63 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
64 /// node of the appropriate kind from the pieces. The default transformation
65 /// routines recursively transform the operands to composite AST nodes (e.g.,
66 /// the pointee type of a PointerType node) and, if any of those operand nodes
67 /// were changed by the transformation, invokes the rebuild operation to create
68 /// a new AST node.
69 ///
70 /// Subclasses can customize the transformation at various levels. The
71 /// most coarse-grained transformations involve replacing TransformType(),
72 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
73 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
74 /// new implementations.
75 ///
76 /// For more fine-grained transformations, subclasses can replace any of the
77 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
78 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
79 /// replacing TransformTemplateTypeParmType() allows template instantiation
80 /// to substitute template arguments for their corresponding template
81 /// parameters. Additionally, subclasses can override the \c RebuildXXX
82 /// functions to control how AST nodes are rebuilt when their operands change.
83 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
84 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
85 /// be able to use more efficient rebuild steps.
86 ///
87 /// There are a handful of other functions that can be overridden, allowing one
88 /// to avoid traversing nodes that don't need any transformation
89 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
90 /// operands have not changed (\c AlwaysRebuild()), and customize the
91 /// default locations and entity names used for type-checking
92 /// (\c getBaseLocation(), \c getBaseEntity()).
93 template<typename Derived>
94 class TreeTransform {
95 /// \brief Private RAII object that helps us forget and then re-remember
96 /// the template argument corresponding to a partially-substituted parameter
97 /// pack.
98 class ForgetPartiallySubstitutedPackRAII {
99 Derived &Self;
100 TemplateArgument Old;
101
102 public:
ForgetPartiallySubstitutedPackRAII(Derived & Self)103 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
104 Old = Self.ForgetPartiallySubstitutedPack();
105 }
106
~ForgetPartiallySubstitutedPackRAII()107 ~ForgetPartiallySubstitutedPackRAII() {
108 Self.RememberPartiallySubstitutedPack(Old);
109 }
110 };
111
112 protected:
113 Sema &SemaRef;
114
115 /// \brief The set of local declarations that have been transformed, for
116 /// cases where we are forced to build new declarations within the transformer
117 /// rather than in the subclass (e.g., lambda closure types).
118 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
119
120 public:
121 /// \brief Initializes a new tree transformer.
TreeTransform(Sema & SemaRef)122 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
123
124 /// \brief Retrieves a reference to the derived class.
getDerived()125 Derived &getDerived() { return static_cast<Derived&>(*this); }
126
127 /// \brief Retrieves a reference to the derived class.
getDerived()128 const Derived &getDerived() const {
129 return static_cast<const Derived&>(*this);
130 }
131
Owned(Expr * E)132 static inline ExprResult Owned(Expr *E) { return E; }
Owned(Stmt * S)133 static inline StmtResult Owned(Stmt *S) { return S; }
134
135 /// \brief Retrieves a reference to the semantic analysis object used for
136 /// this tree transform.
getSema()137 Sema &getSema() const { return SemaRef; }
138
139 /// \brief Whether the transformation should always rebuild AST nodes, even
140 /// if none of the children have changed.
141 ///
142 /// Subclasses may override this function to specify when the transformation
143 /// should rebuild all AST nodes.
144 ///
145 /// We must always rebuild all AST nodes when performing variadic template
146 /// pack expansion, in order to avoid violating the AST invariant that each
147 /// statement node appears at most once in its containing declaration.
AlwaysRebuild()148 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
149
150 /// \brief Returns the location of the entity being transformed, if that
151 /// information was not available elsewhere in the AST.
152 ///
153 /// By default, returns no source-location information. Subclasses can
154 /// provide an alternative implementation that provides better location
155 /// information.
getBaseLocation()156 SourceLocation getBaseLocation() { return SourceLocation(); }
157
158 /// \brief Returns the name of the entity being transformed, if that
159 /// information was not available elsewhere in the AST.
160 ///
161 /// By default, returns an empty name. Subclasses can provide an alternative
162 /// implementation with a more precise name.
getBaseEntity()163 DeclarationName getBaseEntity() { return DeclarationName(); }
164
165 /// \brief Sets the "base" location and entity when that
166 /// information is known based on another transformation.
167 ///
168 /// By default, the source location and entity are ignored. Subclasses can
169 /// override this function to provide a customized implementation.
setBase(SourceLocation Loc,DeclarationName Entity)170 void setBase(SourceLocation Loc, DeclarationName Entity) { }
171
172 /// \brief RAII object that temporarily sets the base location and entity
173 /// used for reporting diagnostics in types.
174 class TemporaryBase {
175 TreeTransform &Self;
176 SourceLocation OldLocation;
177 DeclarationName OldEntity;
178
179 public:
TemporaryBase(TreeTransform & Self,SourceLocation Location,DeclarationName Entity)180 TemporaryBase(TreeTransform &Self, SourceLocation Location,
181 DeclarationName Entity) : Self(Self) {
182 OldLocation = Self.getDerived().getBaseLocation();
183 OldEntity = Self.getDerived().getBaseEntity();
184
185 if (Location.isValid())
186 Self.getDerived().setBase(Location, Entity);
187 }
188
~TemporaryBase()189 ~TemporaryBase() {
190 Self.getDerived().setBase(OldLocation, OldEntity);
191 }
192 };
193
194 /// \brief Determine whether the given type \p T has already been
195 /// transformed.
196 ///
197 /// Subclasses can provide an alternative implementation of this routine
198 /// to short-circuit evaluation when it is known that a given type will
199 /// not change. For example, template instantiation need not traverse
200 /// non-dependent types.
AlreadyTransformed(QualType T)201 bool AlreadyTransformed(QualType T) {
202 return T.isNull();
203 }
204
205 /// \brief Determine whether the given call argument should be dropped, e.g.,
206 /// because it is a default argument.
207 ///
208 /// Subclasses can provide an alternative implementation of this routine to
209 /// determine which kinds of call arguments get dropped. By default,
210 /// CXXDefaultArgument nodes are dropped (prior to transformation).
DropCallArgument(Expr * E)211 bool DropCallArgument(Expr *E) {
212 return E->isDefaultArgument();
213 }
214
215 /// \brief Determine whether we should expand a pack expansion with the
216 /// given set of parameter packs into separate arguments by repeatedly
217 /// transforming the pattern.
218 ///
219 /// By default, the transformer never tries to expand pack expansions.
220 /// Subclasses can override this routine to provide different behavior.
221 ///
222 /// \param EllipsisLoc The location of the ellipsis that identifies the
223 /// pack expansion.
224 ///
225 /// \param PatternRange The source range that covers the entire pattern of
226 /// the pack expansion.
227 ///
228 /// \param Unexpanded The set of unexpanded parameter packs within the
229 /// pattern.
230 ///
231 /// \param ShouldExpand Will be set to \c true if the transformer should
232 /// expand the corresponding pack expansions into separate arguments. When
233 /// set, \c NumExpansions must also be set.
234 ///
235 /// \param RetainExpansion Whether the caller should add an unexpanded
236 /// pack expansion after all of the expanded arguments. This is used
237 /// when extending explicitly-specified template argument packs per
238 /// C++0x [temp.arg.explicit]p9.
239 ///
240 /// \param NumExpansions The number of separate arguments that will be in
241 /// the expanded form of the corresponding pack expansion. This is both an
242 /// input and an output parameter, which can be set by the caller if the
243 /// number of expansions is known a priori (e.g., due to a prior substitution)
244 /// and will be set by the callee when the number of expansions is known.
245 /// The callee must set this value when \c ShouldExpand is \c true; it may
246 /// set this value in other cases.
247 ///
248 /// \returns true if an error occurred (e.g., because the parameter packs
249 /// are to be instantiated with arguments of different lengths), false
250 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
251 /// must be set.
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,ArrayRef<UnexpandedParameterPack> Unexpanded,bool & ShouldExpand,bool & RetainExpansion,Optional<unsigned> & NumExpansions)252 bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
253 SourceRange PatternRange,
254 ArrayRef<UnexpandedParameterPack> Unexpanded,
255 bool &ShouldExpand,
256 bool &RetainExpansion,
257 Optional<unsigned> &NumExpansions) {
258 ShouldExpand = false;
259 return false;
260 }
261
262 /// \brief "Forget" about the partially-substituted pack template argument,
263 /// when performing an instantiation that must preserve the parameter pack
264 /// use.
265 ///
266 /// This routine is meant to be overridden by the template instantiator.
ForgetPartiallySubstitutedPack()267 TemplateArgument ForgetPartiallySubstitutedPack() {
268 return TemplateArgument();
269 }
270
271 /// \brief "Remember" the partially-substituted pack template argument
272 /// after performing an instantiation that must preserve the parameter pack
273 /// use.
274 ///
275 /// This routine is meant to be overridden by the template instantiator.
RememberPartiallySubstitutedPack(TemplateArgument Arg)276 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
277
278 /// \brief Note to the derived class when a function parameter pack is
279 /// being expanded.
ExpandingFunctionParameterPack(ParmVarDecl * Pack)280 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
281
282 /// \brief Transforms the given type into another type.
283 ///
284 /// By default, this routine transforms a type by creating a
285 /// TypeSourceInfo for it and delegating to the appropriate
286 /// function. This is expensive, but we don't mind, because
287 /// this method is deprecated anyway; all users should be
288 /// switched to storing TypeSourceInfos.
289 ///
290 /// \returns the transformed type.
291 QualType TransformType(QualType T);
292
293 /// \brief Transforms the given type-with-location into a new
294 /// type-with-location.
295 ///
296 /// By default, this routine transforms a type by delegating to the
297 /// appropriate TransformXXXType to build a new type. Subclasses
298 /// may override this function (to take over all type
299 /// transformations) or some set of the TransformXXXType functions
300 /// to alter the transformation.
301 TypeSourceInfo *TransformType(TypeSourceInfo *DI);
302
303 /// \brief Transform the given type-with-location into a new
304 /// type, collecting location information in the given builder
305 /// as necessary.
306 ///
307 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
308
309 /// \brief Transform the given statement.
310 ///
311 /// By default, this routine transforms a statement by delegating to the
312 /// appropriate TransformXXXStmt function to transform a specific kind of
313 /// statement or the TransformExpr() function to transform an expression.
314 /// Subclasses may override this function to transform statements using some
315 /// other mechanism.
316 ///
317 /// \returns the transformed statement.
318 StmtResult TransformStmt(Stmt *S);
319
320 /// \brief Transform the given statement.
321 ///
322 /// By default, this routine transforms a statement by delegating to the
323 /// appropriate TransformOMPXXXClause function to transform a specific kind
324 /// of clause. Subclasses may override this function to transform statements
325 /// using some other mechanism.
326 ///
327 /// \returns the transformed OpenMP clause.
328 OMPClause *TransformOMPClause(OMPClause *S);
329
330 /// \brief Transform the given expression.
331 ///
332 /// By default, this routine transforms an expression by delegating to the
333 /// appropriate TransformXXXExpr function to build a new expression.
334 /// Subclasses may override this function to transform expressions using some
335 /// other mechanism.
336 ///
337 /// \returns the transformed expression.
338 ExprResult TransformExpr(Expr *E);
339
340 /// \brief Transform the given initializer.
341 ///
342 /// By default, this routine transforms an initializer by stripping off the
343 /// semantic nodes added by initialization, then passing the result to
344 /// TransformExpr or TransformExprs.
345 ///
346 /// \returns the transformed initializer.
347 ExprResult TransformInitializer(Expr *Init, bool CXXDirectInit);
348
349 /// \brief Transform the given list of expressions.
350 ///
351 /// This routine transforms a list of expressions by invoking
352 /// \c TransformExpr() for each subexpression. However, it also provides
353 /// support for variadic templates by expanding any pack expansions (if the
354 /// derived class permits such expansion) along the way. When pack expansions
355 /// are present, the number of outputs may not equal the number of inputs.
356 ///
357 /// \param Inputs The set of expressions to be transformed.
358 ///
359 /// \param NumInputs The number of expressions in \c Inputs.
360 ///
361 /// \param IsCall If \c true, then this transform is being performed on
362 /// function-call arguments, and any arguments that should be dropped, will
363 /// be.
364 ///
365 /// \param Outputs The transformed input expressions will be added to this
366 /// vector.
367 ///
368 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
369 /// due to transformation.
370 ///
371 /// \returns true if an error occurred, false otherwise.
372 bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
373 SmallVectorImpl<Expr *> &Outputs,
374 bool *ArgChanged = nullptr);
375
376 /// \brief Transform the given declaration, which is referenced from a type
377 /// or expression.
378 ///
379 /// By default, acts as the identity function on declarations, unless the
380 /// transformer has had to transform the declaration itself. Subclasses
381 /// may override this function to provide alternate behavior.
TransformDecl(SourceLocation Loc,Decl * D)382 Decl *TransformDecl(SourceLocation Loc, Decl *D) {
383 llvm::DenseMap<Decl *, Decl *>::iterator Known
384 = TransformedLocalDecls.find(D);
385 if (Known != TransformedLocalDecls.end())
386 return Known->second;
387
388 return D;
389 }
390
391 /// \brief Transform the attributes associated with the given declaration and
392 /// place them on the new declaration.
393 ///
394 /// By default, this operation does nothing. Subclasses may override this
395 /// behavior to transform attributes.
transformAttrs(Decl * Old,Decl * New)396 void transformAttrs(Decl *Old, Decl *New) { }
397
398 /// \brief Note that a local declaration has been transformed by this
399 /// transformer.
400 ///
401 /// Local declarations are typically transformed via a call to
402 /// TransformDefinition. However, in some cases (e.g., lambda expressions),
403 /// the transformer itself has to transform the declarations. This routine
404 /// can be overridden by a subclass that keeps track of such mappings.
transformedLocalDecl(Decl * Old,Decl * New)405 void transformedLocalDecl(Decl *Old, Decl *New) {
406 TransformedLocalDecls[Old] = New;
407 }
408
409 /// \brief Transform the definition of the given declaration.
410 ///
411 /// By default, invokes TransformDecl() to transform the declaration.
412 /// Subclasses may override this function to provide alternate behavior.
TransformDefinition(SourceLocation Loc,Decl * D)413 Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
414 return getDerived().TransformDecl(Loc, D);
415 }
416
417 /// \brief Transform the given declaration, which was the first part of a
418 /// nested-name-specifier in a member access expression.
419 ///
420 /// This specific declaration transformation only applies to the first
421 /// identifier in a nested-name-specifier of a member access expression, e.g.,
422 /// the \c T in \c x->T::member
423 ///
424 /// By default, invokes TransformDecl() to transform the declaration.
425 /// Subclasses may override this function to provide alternate behavior.
TransformFirstQualifierInScope(NamedDecl * D,SourceLocation Loc)426 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
427 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
428 }
429
430 /// \brief Transform the given nested-name-specifier with source-location
431 /// information.
432 ///
433 /// By default, transforms all of the types and declarations within the
434 /// nested-name-specifier. Subclasses may override this function to provide
435 /// alternate behavior.
436 NestedNameSpecifierLoc
437 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
438 QualType ObjectType = QualType(),
439 NamedDecl *FirstQualifierInScope = nullptr);
440
441 /// \brief Transform the given declaration name.
442 ///
443 /// By default, transforms the types of conversion function, constructor,
444 /// and destructor names and then (if needed) rebuilds the declaration name.
445 /// Identifiers and selectors are returned unmodified. Sublcasses may
446 /// override this function to provide alternate behavior.
447 DeclarationNameInfo
448 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
449
450 /// \brief Transform the given template name.
451 ///
452 /// \param SS The nested-name-specifier that qualifies the template
453 /// name. This nested-name-specifier must already have been transformed.
454 ///
455 /// \param Name The template name to transform.
456 ///
457 /// \param NameLoc The source location of the template name.
458 ///
459 /// \param ObjectType If we're translating a template name within a member
460 /// access expression, this is the type of the object whose member template
461 /// is being referenced.
462 ///
463 /// \param FirstQualifierInScope If the first part of a nested-name-specifier
464 /// also refers to a name within the current (lexical) scope, this is the
465 /// declaration it refers to.
466 ///
467 /// By default, transforms the template name by transforming the declarations
468 /// and nested-name-specifiers that occur within the template name.
469 /// Subclasses may override this function to provide alternate behavior.
470 TemplateName
471 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
472 SourceLocation NameLoc,
473 QualType ObjectType = QualType(),
474 NamedDecl *FirstQualifierInScope = nullptr);
475
476 /// \brief Transform the given template argument.
477 ///
478 /// By default, this operation transforms the type, expression, or
479 /// declaration stored within the template argument and constructs a
480 /// new template argument from the transformed result. Subclasses may
481 /// override this function to provide alternate behavior.
482 ///
483 /// Returns true if there was an error.
484 bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
485 TemplateArgumentLoc &Output);
486
487 /// \brief Transform the given set of template arguments.
488 ///
489 /// By default, this operation transforms all of the template arguments
490 /// in the input set using \c TransformTemplateArgument(), and appends
491 /// the transformed arguments to the output list.
492 ///
493 /// Note that this overload of \c TransformTemplateArguments() is merely
494 /// a convenience function. Subclasses that wish to override this behavior
495 /// should override the iterator-based member template version.
496 ///
497 /// \param Inputs The set of template arguments to be transformed.
498 ///
499 /// \param NumInputs The number of template arguments in \p Inputs.
500 ///
501 /// \param Outputs The set of transformed template arguments output by this
502 /// routine.
503 ///
504 /// Returns true if an error occurred.
TransformTemplateArguments(const TemplateArgumentLoc * Inputs,unsigned NumInputs,TemplateArgumentListInfo & Outputs)505 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
506 unsigned NumInputs,
507 TemplateArgumentListInfo &Outputs) {
508 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
509 }
510
511 /// \brief Transform the given set of template arguments.
512 ///
513 /// By default, this operation transforms all of the template arguments
514 /// in the input set using \c TransformTemplateArgument(), and appends
515 /// the transformed arguments to the output list.
516 ///
517 /// \param First An iterator to the first template argument.
518 ///
519 /// \param Last An iterator one step past the last template argument.
520 ///
521 /// \param Outputs The set of transformed template arguments output by this
522 /// routine.
523 ///
524 /// Returns true if an error occurred.
525 template<typename InputIterator>
526 bool TransformTemplateArguments(InputIterator First,
527 InputIterator Last,
528 TemplateArgumentListInfo &Outputs);
529
530 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
531 void InventTemplateArgumentLoc(const TemplateArgument &Arg,
532 TemplateArgumentLoc &ArgLoc);
533
534 /// \brief Fakes up a TypeSourceInfo for a type.
InventTypeSourceInfo(QualType T)535 TypeSourceInfo *InventTypeSourceInfo(QualType T) {
536 return SemaRef.Context.getTrivialTypeSourceInfo(T,
537 getDerived().getBaseLocation());
538 }
539
540 #define ABSTRACT_TYPELOC(CLASS, PARENT)
541 #define TYPELOC(CLASS, PARENT) \
542 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
543 #include "clang/AST/TypeLocNodes.def"
544
545 QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
546 FunctionProtoTypeLoc TL,
547 CXXRecordDecl *ThisContext,
548 unsigned ThisTypeQuals);
549
550 StmtResult TransformSEHHandler(Stmt *Handler);
551
552 QualType
553 TransformTemplateSpecializationType(TypeLocBuilder &TLB,
554 TemplateSpecializationTypeLoc TL,
555 TemplateName Template);
556
557 QualType
558 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
559 DependentTemplateSpecializationTypeLoc TL,
560 TemplateName Template,
561 CXXScopeSpec &SS);
562
563 QualType
564 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
565 DependentTemplateSpecializationTypeLoc TL,
566 NestedNameSpecifierLoc QualifierLoc);
567
568 /// \brief Transforms the parameters of a function type into the
569 /// given vectors.
570 ///
571 /// The result vectors should be kept in sync; null entries in the
572 /// variables vector are acceptable.
573 ///
574 /// Return true on error.
575 bool TransformFunctionTypeParams(SourceLocation Loc,
576 ParmVarDecl **Params, unsigned NumParams,
577 const QualType *ParamTypes,
578 SmallVectorImpl<QualType> &PTypes,
579 SmallVectorImpl<ParmVarDecl*> *PVars);
580
581 /// \brief Transforms a single function-type parameter. Return null
582 /// on error.
583 ///
584 /// \param indexAdjustment - A number to add to the parameter's
585 /// scope index; can be negative
586 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
587 int indexAdjustment,
588 Optional<unsigned> NumExpansions,
589 bool ExpectParameterPack);
590
591 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
592
593 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
594 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
595
596 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
597 /// \brief Transform the captures and body of a lambda expression.
598 ExprResult TransformLambdaScope(LambdaExpr *E, CXXMethodDecl *CallOperator,
599 ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes);
600
TransformTemplateParameterList(TemplateParameterList * TPL)601 TemplateParameterList *TransformTemplateParameterList(
602 TemplateParameterList *TPL) {
603 return TPL;
604 }
605
606 ExprResult TransformAddressOfOperand(Expr *E);
607
608 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
609 bool IsAddressOfOperand,
610 TypeSourceInfo **RecoveryTSI);
611
612 ExprResult TransformParenDependentScopeDeclRefExpr(
613 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
614 TypeSourceInfo **RecoveryTSI);
615
616 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
617
618 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
619 // amount of stack usage with clang.
620 #define STMT(Node, Parent) \
621 LLVM_ATTRIBUTE_NOINLINE \
622 StmtResult Transform##Node(Node *S);
623 #define EXPR(Node, Parent) \
624 LLVM_ATTRIBUTE_NOINLINE \
625 ExprResult Transform##Node(Node *E);
626 #define ABSTRACT_STMT(Stmt)
627 #include "clang/AST/StmtNodes.inc"
628
629 #define OPENMP_CLAUSE(Name, Class) \
630 LLVM_ATTRIBUTE_NOINLINE \
631 OMPClause *Transform ## Class(Class *S);
632 #include "clang/Basic/OpenMPKinds.def"
633
634 /// \brief Build a new pointer type given its pointee type.
635 ///
636 /// By default, performs semantic analysis when building the pointer type.
637 /// Subclasses may override this routine to provide different behavior.
638 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
639
640 /// \brief Build a new block pointer type given its pointee type.
641 ///
642 /// By default, performs semantic analysis when building the block pointer
643 /// type. Subclasses may override this routine to provide different behavior.
644 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
645
646 /// \brief Build a new reference type given the type it references.
647 ///
648 /// By default, performs semantic analysis when building the
649 /// reference type. Subclasses may override this routine to provide
650 /// different behavior.
651 ///
652 /// \param LValue whether the type was written with an lvalue sigil
653 /// or an rvalue sigil.
654 QualType RebuildReferenceType(QualType ReferentType,
655 bool LValue,
656 SourceLocation Sigil);
657
658 /// \brief Build a new member pointer type given the pointee type and the
659 /// class type it refers into.
660 ///
661 /// By default, performs semantic analysis when building the member pointer
662 /// type. Subclasses may override this routine to provide different behavior.
663 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
664 SourceLocation Sigil);
665
666 /// \brief Build a new array type given the element type, size
667 /// modifier, size of the array (if known), size expression, and index type
668 /// qualifiers.
669 ///
670 /// By default, performs semantic analysis when building the array type.
671 /// Subclasses may override this routine to provide different behavior.
672 /// Also by default, all of the other Rebuild*Array
673 QualType RebuildArrayType(QualType ElementType,
674 ArrayType::ArraySizeModifier SizeMod,
675 const llvm::APInt *Size,
676 Expr *SizeExpr,
677 unsigned IndexTypeQuals,
678 SourceRange BracketsRange);
679
680 /// \brief Build a new constant array type given the element type, size
681 /// modifier, (known) size of the array, and index type qualifiers.
682 ///
683 /// By default, performs semantic analysis when building the array type.
684 /// Subclasses may override this routine to provide different behavior.
685 QualType RebuildConstantArrayType(QualType ElementType,
686 ArrayType::ArraySizeModifier SizeMod,
687 const llvm::APInt &Size,
688 unsigned IndexTypeQuals,
689 SourceRange BracketsRange);
690
691 /// \brief Build a new incomplete array type given the element type, size
692 /// modifier, and index type qualifiers.
693 ///
694 /// By default, performs semantic analysis when building the array type.
695 /// Subclasses may override this routine to provide different behavior.
696 QualType RebuildIncompleteArrayType(QualType ElementType,
697 ArrayType::ArraySizeModifier SizeMod,
698 unsigned IndexTypeQuals,
699 SourceRange BracketsRange);
700
701 /// \brief Build a new variable-length array type given the element type,
702 /// size modifier, size expression, and index type qualifiers.
703 ///
704 /// By default, performs semantic analysis when building the array type.
705 /// Subclasses may override this routine to provide different behavior.
706 QualType RebuildVariableArrayType(QualType ElementType,
707 ArrayType::ArraySizeModifier SizeMod,
708 Expr *SizeExpr,
709 unsigned IndexTypeQuals,
710 SourceRange BracketsRange);
711
712 /// \brief Build a new dependent-sized array type given the element type,
713 /// size modifier, size expression, and index type qualifiers.
714 ///
715 /// By default, performs semantic analysis when building the array type.
716 /// Subclasses may override this routine to provide different behavior.
717 QualType RebuildDependentSizedArrayType(QualType ElementType,
718 ArrayType::ArraySizeModifier SizeMod,
719 Expr *SizeExpr,
720 unsigned IndexTypeQuals,
721 SourceRange BracketsRange);
722
723 /// \brief Build a new vector type given the element type and
724 /// number of elements.
725 ///
726 /// By default, performs semantic analysis when building the vector type.
727 /// Subclasses may override this routine to provide different behavior.
728 QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
729 VectorType::VectorKind VecKind);
730
731 /// \brief Build a new extended vector type given the element type and
732 /// number of elements.
733 ///
734 /// By default, performs semantic analysis when building the vector type.
735 /// Subclasses may override this routine to provide different behavior.
736 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
737 SourceLocation AttributeLoc);
738
739 /// \brief Build a new potentially dependently-sized extended vector type
740 /// given the element type and number of elements.
741 ///
742 /// By default, performs semantic analysis when building the vector type.
743 /// Subclasses may override this routine to provide different behavior.
744 QualType RebuildDependentSizedExtVectorType(QualType ElementType,
745 Expr *SizeExpr,
746 SourceLocation AttributeLoc);
747
748 /// \brief Build a new function type.
749 ///
750 /// By default, performs semantic analysis when building the function type.
751 /// Subclasses may override this routine to provide different behavior.
752 QualType RebuildFunctionProtoType(QualType T,
753 MutableArrayRef<QualType> ParamTypes,
754 const FunctionProtoType::ExtProtoInfo &EPI);
755
756 /// \brief Build a new unprototyped function type.
757 QualType RebuildFunctionNoProtoType(QualType ResultType);
758
759 /// \brief Rebuild an unresolved typename type, given the decl that
760 /// the UnresolvedUsingTypenameDecl was transformed to.
761 QualType RebuildUnresolvedUsingType(Decl *D);
762
763 /// \brief Build a new typedef type.
RebuildTypedefType(TypedefNameDecl * Typedef)764 QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
765 return SemaRef.Context.getTypeDeclType(Typedef);
766 }
767
768 /// \brief Build a new class/struct/union type.
RebuildRecordType(RecordDecl * Record)769 QualType RebuildRecordType(RecordDecl *Record) {
770 return SemaRef.Context.getTypeDeclType(Record);
771 }
772
773 /// \brief Build a new Enum type.
RebuildEnumType(EnumDecl * Enum)774 QualType RebuildEnumType(EnumDecl *Enum) {
775 return SemaRef.Context.getTypeDeclType(Enum);
776 }
777
778 /// \brief Build a new typeof(expr) type.
779 ///
780 /// By default, performs semantic analysis when building the typeof type.
781 /// Subclasses may override this routine to provide different behavior.
782 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
783
784 /// \brief Build a new typeof(type) type.
785 ///
786 /// By default, builds a new TypeOfType with the given underlying type.
787 QualType RebuildTypeOfType(QualType Underlying);
788
789 /// \brief Build a new unary transform type.
790 QualType RebuildUnaryTransformType(QualType BaseType,
791 UnaryTransformType::UTTKind UKind,
792 SourceLocation Loc);
793
794 /// \brief Build a new C++11 decltype type.
795 ///
796 /// By default, performs semantic analysis when building the decltype type.
797 /// Subclasses may override this routine to provide different behavior.
798 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
799
800 /// \brief Build a new C++11 auto type.
801 ///
802 /// By default, builds a new AutoType with the given deduced type.
RebuildAutoType(QualType Deduced,bool IsDecltypeAuto)803 QualType RebuildAutoType(QualType Deduced, bool IsDecltypeAuto) {
804 // Note, IsDependent is always false here: we implicitly convert an 'auto'
805 // which has been deduced to a dependent type into an undeduced 'auto', so
806 // that we'll retry deduction after the transformation.
807 return SemaRef.Context.getAutoType(Deduced, IsDecltypeAuto,
808 /*IsDependent*/ false);
809 }
810
811 /// \brief Build a new template specialization type.
812 ///
813 /// By default, performs semantic analysis when building the template
814 /// specialization type. Subclasses may override this routine to provide
815 /// different behavior.
816 QualType RebuildTemplateSpecializationType(TemplateName Template,
817 SourceLocation TemplateLoc,
818 TemplateArgumentListInfo &Args);
819
820 /// \brief Build a new parenthesized type.
821 ///
822 /// By default, builds a new ParenType type from the inner type.
823 /// Subclasses may override this routine to provide different behavior.
RebuildParenType(QualType InnerType)824 QualType RebuildParenType(QualType InnerType) {
825 return SemaRef.Context.getParenType(InnerType);
826 }
827
828 /// \brief Build a new qualified name type.
829 ///
830 /// By default, builds a new ElaboratedType type from the keyword,
831 /// the nested-name-specifier and the named type.
832 /// Subclasses may override this routine to provide different behavior.
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType Named)833 QualType RebuildElaboratedType(SourceLocation KeywordLoc,
834 ElaboratedTypeKeyword Keyword,
835 NestedNameSpecifierLoc QualifierLoc,
836 QualType Named) {
837 return SemaRef.Context.getElaboratedType(Keyword,
838 QualifierLoc.getNestedNameSpecifier(),
839 Named);
840 }
841
842 /// \brief Build a new typename type that refers to a template-id.
843 ///
844 /// By default, builds a new DependentNameType type from the
845 /// nested-name-specifier and the given type. Subclasses may override
846 /// this routine to provide different behavior.
RebuildDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Name,SourceLocation NameLoc,TemplateArgumentListInfo & Args)847 QualType RebuildDependentTemplateSpecializationType(
848 ElaboratedTypeKeyword Keyword,
849 NestedNameSpecifierLoc QualifierLoc,
850 const IdentifierInfo *Name,
851 SourceLocation NameLoc,
852 TemplateArgumentListInfo &Args) {
853 // Rebuild the template name.
854 // TODO: avoid TemplateName abstraction
855 CXXScopeSpec SS;
856 SS.Adopt(QualifierLoc);
857 TemplateName InstName
858 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
859 nullptr);
860
861 if (InstName.isNull())
862 return QualType();
863
864 // If it's still dependent, make a dependent specialization.
865 if (InstName.getAsDependentTemplateName())
866 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
867 QualifierLoc.getNestedNameSpecifier(),
868 Name,
869 Args);
870
871 // Otherwise, make an elaborated type wrapping a non-dependent
872 // specialization.
873 QualType T =
874 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
875 if (T.isNull()) return QualType();
876
877 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
878 return T;
879
880 return SemaRef.Context.getElaboratedType(Keyword,
881 QualifierLoc.getNestedNameSpecifier(),
882 T);
883 }
884
885 /// \brief Build a new typename type that refers to an identifier.
886 ///
887 /// By default, performs semantic analysis when building the typename type
888 /// (or elaborated type). Subclasses may override this routine to provide
889 /// different behavior.
RebuildDependentNameType(ElaboratedTypeKeyword Keyword,SourceLocation KeywordLoc,NestedNameSpecifierLoc QualifierLoc,const IdentifierInfo * Id,SourceLocation IdLoc)890 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
891 SourceLocation KeywordLoc,
892 NestedNameSpecifierLoc QualifierLoc,
893 const IdentifierInfo *Id,
894 SourceLocation IdLoc) {
895 CXXScopeSpec SS;
896 SS.Adopt(QualifierLoc);
897
898 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
899 // If the name is still dependent, just build a new dependent name type.
900 if (!SemaRef.computeDeclContext(SS))
901 return SemaRef.Context.getDependentNameType(Keyword,
902 QualifierLoc.getNestedNameSpecifier(),
903 Id);
904 }
905
906 if (Keyword == ETK_None || Keyword == ETK_Typename)
907 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
908 *Id, IdLoc);
909
910 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
911
912 // We had a dependent elaborated-type-specifier that has been transformed
913 // into a non-dependent elaborated-type-specifier. Find the tag we're
914 // referring to.
915 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
916 DeclContext *DC = SemaRef.computeDeclContext(SS, false);
917 if (!DC)
918 return QualType();
919
920 if (SemaRef.RequireCompleteDeclContext(SS, DC))
921 return QualType();
922
923 TagDecl *Tag = nullptr;
924 SemaRef.LookupQualifiedName(Result, DC);
925 switch (Result.getResultKind()) {
926 case LookupResult::NotFound:
927 case LookupResult::NotFoundInCurrentInstantiation:
928 break;
929
930 case LookupResult::Found:
931 Tag = Result.getAsSingle<TagDecl>();
932 break;
933
934 case LookupResult::FoundOverloaded:
935 case LookupResult::FoundUnresolvedValue:
936 llvm_unreachable("Tag lookup cannot find non-tags");
937
938 case LookupResult::Ambiguous:
939 // Let the LookupResult structure handle ambiguities.
940 return QualType();
941 }
942
943 if (!Tag) {
944 // Check where the name exists but isn't a tag type and use that to emit
945 // better diagnostics.
946 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
947 SemaRef.LookupQualifiedName(Result, DC);
948 switch (Result.getResultKind()) {
949 case LookupResult::Found:
950 case LookupResult::FoundOverloaded:
951 case LookupResult::FoundUnresolvedValue: {
952 NamedDecl *SomeDecl = Result.getRepresentativeDecl();
953 unsigned Kind = 0;
954 if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
955 else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
956 else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
957 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
958 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
959 break;
960 }
961 default:
962 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
963 << Kind << Id << DC << QualifierLoc.getSourceRange();
964 break;
965 }
966 return QualType();
967 }
968
969 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
970 IdLoc, *Id)) {
971 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
972 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
973 return QualType();
974 }
975
976 // Build the elaborated-type-specifier type.
977 QualType T = SemaRef.Context.getTypeDeclType(Tag);
978 return SemaRef.Context.getElaboratedType(Keyword,
979 QualifierLoc.getNestedNameSpecifier(),
980 T);
981 }
982
983 /// \brief Build a new pack expansion type.
984 ///
985 /// By default, builds a new PackExpansionType type from the given pattern.
986 /// Subclasses may override this routine to provide different behavior.
RebuildPackExpansionType(QualType Pattern,SourceRange PatternRange,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)987 QualType RebuildPackExpansionType(QualType Pattern,
988 SourceRange PatternRange,
989 SourceLocation EllipsisLoc,
990 Optional<unsigned> NumExpansions) {
991 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
992 NumExpansions);
993 }
994
995 /// \brief Build a new atomic type given its value type.
996 ///
997 /// By default, performs semantic analysis when building the atomic type.
998 /// Subclasses may override this routine to provide different behavior.
999 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1000
1001 /// \brief Build a new template name given a nested name specifier, a flag
1002 /// indicating whether the "template" keyword was provided, and the template
1003 /// that the template name refers to.
1004 ///
1005 /// By default, builds the new template name directly. Subclasses may override
1006 /// this routine to provide different behavior.
1007 TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1008 bool TemplateKW,
1009 TemplateDecl *Template);
1010
1011 /// \brief Build a new template name given a nested name specifier and the
1012 /// name that is referred to as a template.
1013 ///
1014 /// By default, performs semantic analysis to determine whether the name can
1015 /// be resolved to a specific template, then builds the appropriate kind of
1016 /// template name. Subclasses may override this routine to provide different
1017 /// behavior.
1018 TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1019 const IdentifierInfo &Name,
1020 SourceLocation NameLoc,
1021 QualType ObjectType,
1022 NamedDecl *FirstQualifierInScope);
1023
1024 /// \brief Build a new template name given a nested name specifier and the
1025 /// overloaded operator name that is referred to as a template.
1026 ///
1027 /// By default, performs semantic analysis to determine whether the name can
1028 /// be resolved to a specific template, then builds the appropriate kind of
1029 /// template name. Subclasses may override this routine to provide different
1030 /// behavior.
1031 TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1032 OverloadedOperatorKind Operator,
1033 SourceLocation NameLoc,
1034 QualType ObjectType);
1035
1036 /// \brief Build a new template name given a template template parameter pack
1037 /// and the
1038 ///
1039 /// By default, performs semantic analysis to determine whether the name can
1040 /// be resolved to a specific template, then builds the appropriate kind of
1041 /// template name. Subclasses may override this routine to provide different
1042 /// behavior.
RebuildTemplateName(TemplateTemplateParmDecl * Param,const TemplateArgument & ArgPack)1043 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1044 const TemplateArgument &ArgPack) {
1045 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1046 }
1047
1048 /// \brief Build a new compound statement.
1049 ///
1050 /// By default, performs semantic analysis to build the new statement.
1051 /// Subclasses may override this routine to provide different behavior.
RebuildCompoundStmt(SourceLocation LBraceLoc,MultiStmtArg Statements,SourceLocation RBraceLoc,bool IsStmtExpr)1052 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1053 MultiStmtArg Statements,
1054 SourceLocation RBraceLoc,
1055 bool IsStmtExpr) {
1056 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1057 IsStmtExpr);
1058 }
1059
1060 /// \brief Build a new case statement.
1061 ///
1062 /// By default, performs semantic analysis to build the new statement.
1063 /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmt(SourceLocation CaseLoc,Expr * LHS,SourceLocation EllipsisLoc,Expr * RHS,SourceLocation ColonLoc)1064 StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1065 Expr *LHS,
1066 SourceLocation EllipsisLoc,
1067 Expr *RHS,
1068 SourceLocation ColonLoc) {
1069 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1070 ColonLoc);
1071 }
1072
1073 /// \brief Attach the body to a new case statement.
1074 ///
1075 /// By default, performs semantic analysis to build the new statement.
1076 /// Subclasses may override this routine to provide different behavior.
RebuildCaseStmtBody(Stmt * S,Stmt * Body)1077 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1078 getSema().ActOnCaseStmtBody(S, Body);
1079 return S;
1080 }
1081
1082 /// \brief Build a new default statement.
1083 ///
1084 /// By default, performs semantic analysis to build the new statement.
1085 /// Subclasses may override this routine to provide different behavior.
RebuildDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt)1086 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1087 SourceLocation ColonLoc,
1088 Stmt *SubStmt) {
1089 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1090 /*CurScope=*/nullptr);
1091 }
1092
1093 /// \brief Build a new label statement.
1094 ///
1095 /// By default, performs semantic analysis to build the new statement.
1096 /// Subclasses may override this routine to provide different behavior.
RebuildLabelStmt(SourceLocation IdentLoc,LabelDecl * L,SourceLocation ColonLoc,Stmt * SubStmt)1097 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1098 SourceLocation ColonLoc, Stmt *SubStmt) {
1099 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1100 }
1101
1102 /// \brief Build a new label statement.
1103 ///
1104 /// By default, performs semantic analysis to build the new statement.
1105 /// Subclasses may override this routine to provide different behavior.
RebuildAttributedStmt(SourceLocation AttrLoc,ArrayRef<const Attr * > Attrs,Stmt * SubStmt)1106 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1107 ArrayRef<const Attr*> Attrs,
1108 Stmt *SubStmt) {
1109 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1110 }
1111
1112 /// \brief Build a new "if" statement.
1113 ///
1114 /// By default, performs semantic analysis to build the new statement.
1115 /// Subclasses may override this routine to provide different behavior.
RebuildIfStmt(SourceLocation IfLoc,Sema::FullExprArg Cond,VarDecl * CondVar,Stmt * Then,SourceLocation ElseLoc,Stmt * Else)1116 StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
1117 VarDecl *CondVar, Stmt *Then,
1118 SourceLocation ElseLoc, Stmt *Else) {
1119 return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
1120 }
1121
1122 /// \brief Start building a new switch statement.
1123 ///
1124 /// By default, performs semantic analysis to build the new statement.
1125 /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtStart(SourceLocation SwitchLoc,Expr * Cond,VarDecl * CondVar)1126 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1127 Expr *Cond, VarDecl *CondVar) {
1128 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1129 CondVar);
1130 }
1131
1132 /// \brief Attach the body to the switch statement.
1133 ///
1134 /// By default, performs semantic analysis to build the new statement.
1135 /// Subclasses may override this routine to provide different behavior.
RebuildSwitchStmtBody(SourceLocation SwitchLoc,Stmt * Switch,Stmt * Body)1136 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1137 Stmt *Switch, Stmt *Body) {
1138 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1139 }
1140
1141 /// \brief Build a new while statement.
1142 ///
1143 /// By default, performs semantic analysis to build the new statement.
1144 /// Subclasses may override this routine to provide different behavior.
RebuildWhileStmt(SourceLocation WhileLoc,Sema::FullExprArg Cond,VarDecl * CondVar,Stmt * Body)1145 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
1146 VarDecl *CondVar, Stmt *Body) {
1147 return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
1148 }
1149
1150 /// \brief Build a new do-while statement.
1151 ///
1152 /// By default, performs semantic analysis to build the new statement.
1153 /// Subclasses may override this routine to provide different behavior.
RebuildDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation LParenLoc,Expr * Cond,SourceLocation RParenLoc)1154 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1155 SourceLocation WhileLoc, SourceLocation LParenLoc,
1156 Expr *Cond, SourceLocation RParenLoc) {
1157 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1158 Cond, RParenLoc);
1159 }
1160
1161 /// \brief Build a new for statement.
1162 ///
1163 /// By default, performs semantic analysis to build the new statement.
1164 /// Subclasses may override this routine to provide different behavior.
RebuildForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * Init,Sema::FullExprArg Cond,VarDecl * CondVar,Sema::FullExprArg Inc,SourceLocation RParenLoc,Stmt * Body)1165 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1166 Stmt *Init, Sema::FullExprArg Cond,
1167 VarDecl *CondVar, Sema::FullExprArg Inc,
1168 SourceLocation RParenLoc, Stmt *Body) {
1169 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1170 CondVar, Inc, RParenLoc, Body);
1171 }
1172
1173 /// \brief Build a new goto statement.
1174 ///
1175 /// By default, performs semantic analysis to build the new statement.
1176 /// Subclasses may override this routine to provide different behavior.
RebuildGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * Label)1177 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1178 LabelDecl *Label) {
1179 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1180 }
1181
1182 /// \brief Build a new indirect goto statement.
1183 ///
1184 /// By default, performs semantic analysis to build the new statement.
1185 /// Subclasses may override this routine to provide different behavior.
RebuildIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * Target)1186 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1187 SourceLocation StarLoc,
1188 Expr *Target) {
1189 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1190 }
1191
1192 /// \brief Build a new return statement.
1193 ///
1194 /// By default, performs semantic analysis to build the new statement.
1195 /// Subclasses may override this routine to provide different behavior.
RebuildReturnStmt(SourceLocation ReturnLoc,Expr * Result)1196 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1197 return getSema().BuildReturnStmt(ReturnLoc, Result);
1198 }
1199
1200 /// \brief Build a new declaration statement.
1201 ///
1202 /// By default, performs semantic analysis to build the new statement.
1203 /// Subclasses may override this routine to provide different behavior.
RebuildDeclStmt(MutableArrayRef<Decl * > Decls,SourceLocation StartLoc,SourceLocation EndLoc)1204 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1205 SourceLocation StartLoc, SourceLocation EndLoc) {
1206 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1207 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1208 }
1209
1210 /// \brief Build a new inline asm statement.
1211 ///
1212 /// By default, performs semantic analysis to build the new statement.
1213 /// 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)1214 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1215 bool IsVolatile, unsigned NumOutputs,
1216 unsigned NumInputs, IdentifierInfo **Names,
1217 MultiExprArg Constraints, MultiExprArg Exprs,
1218 Expr *AsmString, MultiExprArg Clobbers,
1219 SourceLocation RParenLoc) {
1220 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1221 NumInputs, Names, Constraints, Exprs,
1222 AsmString, Clobbers, RParenLoc);
1223 }
1224
1225 /// \brief Build a new MS style inline asm statement.
1226 ///
1227 /// By default, performs semantic analysis to build the new statement.
1228 /// 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)1229 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1230 ArrayRef<Token> AsmToks,
1231 StringRef AsmString,
1232 unsigned NumOutputs, unsigned NumInputs,
1233 ArrayRef<StringRef> Constraints,
1234 ArrayRef<StringRef> Clobbers,
1235 ArrayRef<Expr*> Exprs,
1236 SourceLocation EndLoc) {
1237 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1238 NumOutputs, NumInputs,
1239 Constraints, Clobbers, Exprs, EndLoc);
1240 }
1241
1242 /// \brief Build a new Objective-C \@try statement.
1243 ///
1244 /// By default, performs semantic analysis to build the new statement.
1245 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtTryStmt(SourceLocation AtLoc,Stmt * TryBody,MultiStmtArg CatchStmts,Stmt * Finally)1246 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1247 Stmt *TryBody,
1248 MultiStmtArg CatchStmts,
1249 Stmt *Finally) {
1250 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1251 Finally);
1252 }
1253
1254 /// \brief Rebuild an Objective-C exception declaration.
1255 ///
1256 /// By default, performs semantic analysis to build the new declaration.
1257 /// Subclasses may override this routine to provide different behavior.
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TInfo,QualType T)1258 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1259 TypeSourceInfo *TInfo, QualType T) {
1260 return getSema().BuildObjCExceptionDecl(TInfo, T,
1261 ExceptionDecl->getInnerLocStart(),
1262 ExceptionDecl->getLocation(),
1263 ExceptionDecl->getIdentifier());
1264 }
1265
1266 /// \brief Build a new Objective-C \@catch statement.
1267 ///
1268 /// By default, performs semantic analysis to build the new statement.
1269 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParenLoc,VarDecl * Var,Stmt * Body)1270 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1271 SourceLocation RParenLoc,
1272 VarDecl *Var,
1273 Stmt *Body) {
1274 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1275 Var, Body);
1276 }
1277
1278 /// \brief Build a new Objective-C \@finally statement.
1279 ///
1280 /// By default, performs semantic analysis to build the new statement.
1281 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)1282 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1283 Stmt *Body) {
1284 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1285 }
1286
1287 /// \brief Build a new Objective-C \@throw statement.
1288 ///
1289 /// By default, performs semantic analysis to build the new statement.
1290 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Operand)1291 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1292 Expr *Operand) {
1293 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1294 }
1295
1296 /// \brief Build a new OpenMP executable directive.
1297 ///
1298 /// By default, performs semantic analysis to build the new statement.
1299 /// Subclasses may override this routine to provide different behavior.
RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,ArrayRef<OMPClause * > Clauses,Stmt * AStmt,SourceLocation StartLoc,SourceLocation EndLoc)1300 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1301 ArrayRef<OMPClause *> Clauses,
1302 Stmt *AStmt,
1303 SourceLocation StartLoc,
1304 SourceLocation EndLoc) {
1305 return getSema().ActOnOpenMPExecutableDirective(Kind, Clauses, AStmt,
1306 StartLoc, EndLoc);
1307 }
1308
1309 /// \brief Build a new OpenMP 'if' clause.
1310 ///
1311 /// By default, performs semantic analysis to build the new OpenMP clause.
1312 /// Subclasses may override this routine to provide different behavior.
RebuildOMPIfClause(Expr * Condition,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1313 OMPClause *RebuildOMPIfClause(Expr *Condition,
1314 SourceLocation StartLoc,
1315 SourceLocation LParenLoc,
1316 SourceLocation EndLoc) {
1317 return getSema().ActOnOpenMPIfClause(Condition, StartLoc,
1318 LParenLoc, EndLoc);
1319 }
1320
1321 /// \brief Build a new OpenMP 'num_threads' clause.
1322 ///
1323 /// By default, performs semantic analysis to build the new OpenMP clause.
1324 /// Subclasses may override this routine to provide different behavior.
RebuildOMPNumThreadsClause(Expr * NumThreads,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1325 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1326 SourceLocation StartLoc,
1327 SourceLocation LParenLoc,
1328 SourceLocation EndLoc) {
1329 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1330 LParenLoc, EndLoc);
1331 }
1332
1333 /// \brief Build a new OpenMP 'safelen' clause.
1334 ///
1335 /// By default, performs semantic analysis to build the new OpenMP clause.
1336 /// Subclasses may override this routine to provide different behavior.
RebuildOMPSafelenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1337 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1338 SourceLocation LParenLoc,
1339 SourceLocation EndLoc) {
1340 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1341 }
1342
1343 /// \brief Build a new OpenMP 'collapse' clause.
1344 ///
1345 /// By default, performs semantic analysis to build the new OpenMP clause.
1346 /// Subclasses may override this routine to provide different behavior.
RebuildOMPCollapseClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1347 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1348 SourceLocation LParenLoc,
1349 SourceLocation EndLoc) {
1350 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1351 EndLoc);
1352 }
1353
1354 /// \brief Build a new OpenMP 'default' clause.
1355 ///
1356 /// By default, performs semantic analysis to build the new OpenMP clause.
1357 /// Subclasses may override this routine to provide different behavior.
RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1358 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1359 SourceLocation KindKwLoc,
1360 SourceLocation StartLoc,
1361 SourceLocation LParenLoc,
1362 SourceLocation EndLoc) {
1363 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1364 StartLoc, LParenLoc, EndLoc);
1365 }
1366
1367 /// \brief Build a new OpenMP 'proc_bind' clause.
1368 ///
1369 /// By default, performs semantic analysis to build the new OpenMP clause.
1370 /// Subclasses may override this routine to provide different behavior.
RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,SourceLocation KindKwLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1371 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1372 SourceLocation KindKwLoc,
1373 SourceLocation StartLoc,
1374 SourceLocation LParenLoc,
1375 SourceLocation EndLoc) {
1376 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1377 StartLoc, LParenLoc, EndLoc);
1378 }
1379
1380 /// \brief Build a new OpenMP 'schedule' clause.
1381 ///
1382 /// By default, performs semantic analysis to build the new OpenMP clause.
1383 /// Subclasses may override this routine to provide different behavior.
RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind,Expr * ChunkSize,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation KindLoc,SourceLocation CommaLoc,SourceLocation EndLoc)1384 OMPClause *RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind,
1385 Expr *ChunkSize,
1386 SourceLocation StartLoc,
1387 SourceLocation LParenLoc,
1388 SourceLocation KindLoc,
1389 SourceLocation CommaLoc,
1390 SourceLocation EndLoc) {
1391 return getSema().ActOnOpenMPScheduleClause(
1392 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1393 }
1394
1395 /// \brief Build a new OpenMP 'private' clause.
1396 ///
1397 /// By default, performs semantic analysis to build the new OpenMP clause.
1398 /// Subclasses may override this routine to provide different behavior.
RebuildOMPPrivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1399 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1400 SourceLocation StartLoc,
1401 SourceLocation LParenLoc,
1402 SourceLocation EndLoc) {
1403 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1404 EndLoc);
1405 }
1406
1407 /// \brief Build a new OpenMP 'firstprivate' clause.
1408 ///
1409 /// By default, performs semantic analysis to build the new OpenMP clause.
1410 /// Subclasses may override this routine to provide different behavior.
RebuildOMPFirstprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1411 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1412 SourceLocation StartLoc,
1413 SourceLocation LParenLoc,
1414 SourceLocation EndLoc) {
1415 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1416 EndLoc);
1417 }
1418
1419 /// \brief Build a new OpenMP 'lastprivate' clause.
1420 ///
1421 /// By default, performs semantic analysis to build the new OpenMP clause.
1422 /// Subclasses may override this routine to provide different behavior.
RebuildOMPLastprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1423 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1424 SourceLocation StartLoc,
1425 SourceLocation LParenLoc,
1426 SourceLocation EndLoc) {
1427 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1428 EndLoc);
1429 }
1430
1431 /// \brief Build a new OpenMP 'shared' clause.
1432 ///
1433 /// By default, performs semantic analysis to build the new OpenMP clause.
1434 /// Subclasses may override this routine to provide different behavior.
RebuildOMPSharedClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1435 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1436 SourceLocation StartLoc,
1437 SourceLocation LParenLoc,
1438 SourceLocation EndLoc) {
1439 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1440 EndLoc);
1441 }
1442
1443 /// \brief Build a new OpenMP 'reduction' clause.
1444 ///
1445 /// By default, performs semantic analysis to build the new statement.
1446 /// 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)1447 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1448 SourceLocation StartLoc,
1449 SourceLocation LParenLoc,
1450 SourceLocation ColonLoc,
1451 SourceLocation EndLoc,
1452 CXXScopeSpec &ReductionIdScopeSpec,
1453 const DeclarationNameInfo &ReductionId) {
1454 return getSema().ActOnOpenMPReductionClause(
1455 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1456 ReductionId);
1457 }
1458
1459 /// \brief Build a new OpenMP 'linear' clause.
1460 ///
1461 /// By default, performs semantic analysis to build the new OpenMP clause.
1462 /// Subclasses may override this routine to provide different behavior.
RebuildOMPLinearClause(ArrayRef<Expr * > VarList,Expr * Step,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1463 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1464 SourceLocation StartLoc,
1465 SourceLocation LParenLoc,
1466 SourceLocation ColonLoc,
1467 SourceLocation EndLoc) {
1468 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1469 ColonLoc, EndLoc);
1470 }
1471
1472 /// \brief Build a new OpenMP 'aligned' clause.
1473 ///
1474 /// By default, performs semantic analysis to build the new OpenMP clause.
1475 /// Subclasses may override this routine to provide different behavior.
RebuildOMPAlignedClause(ArrayRef<Expr * > VarList,Expr * Alignment,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc)1476 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1477 SourceLocation StartLoc,
1478 SourceLocation LParenLoc,
1479 SourceLocation ColonLoc,
1480 SourceLocation EndLoc) {
1481 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1482 LParenLoc, ColonLoc, EndLoc);
1483 }
1484
1485 /// \brief Build a new OpenMP 'copyin' clause.
1486 ///
1487 /// By default, performs semantic analysis to build the new OpenMP clause.
1488 /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyinClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1489 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1490 SourceLocation StartLoc,
1491 SourceLocation LParenLoc,
1492 SourceLocation EndLoc) {
1493 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1494 EndLoc);
1495 }
1496
1497 /// \brief Build a new OpenMP 'copyprivate' clause.
1498 ///
1499 /// By default, performs semantic analysis to build the new OpenMP clause.
1500 /// Subclasses may override this routine to provide different behavior.
RebuildOMPCopyprivateClause(ArrayRef<Expr * > VarList,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)1501 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1502 SourceLocation StartLoc,
1503 SourceLocation LParenLoc,
1504 SourceLocation EndLoc) {
1505 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1506 EndLoc);
1507 }
1508
1509 /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1510 ///
1511 /// By default, performs semantic analysis to build the new statement.
1512 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,Expr * object)1513 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1514 Expr *object) {
1515 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1516 }
1517
1518 /// \brief Build a new Objective-C \@synchronized statement.
1519 ///
1520 /// By default, performs semantic analysis to build the new statement.
1521 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * Object,Stmt * Body)1522 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1523 Expr *Object, Stmt *Body) {
1524 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1525 }
1526
1527 /// \brief Build a new Objective-C \@autoreleasepool statement.
1528 ///
1529 /// By default, performs semantic analysis to build the new statement.
1530 /// Subclasses may override this routine to provide different behavior.
RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)1531 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1532 Stmt *Body) {
1533 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1534 }
1535
1536 /// \brief Build a new Objective-C fast enumeration statement.
1537 ///
1538 /// By default, performs semantic analysis to build the new statement.
1539 /// Subclasses may override this routine to provide different behavior.
RebuildObjCForCollectionStmt(SourceLocation ForLoc,Stmt * Element,Expr * Collection,SourceLocation RParenLoc,Stmt * Body)1540 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1541 Stmt *Element,
1542 Expr *Collection,
1543 SourceLocation RParenLoc,
1544 Stmt *Body) {
1545 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1546 Element,
1547 Collection,
1548 RParenLoc);
1549 if (ForEachStmt.isInvalid())
1550 return StmtError();
1551
1552 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1553 }
1554
1555 /// \brief Build a new C++ exception declaration.
1556 ///
1557 /// By default, performs semantic analysis to build the new decaration.
1558 /// Subclasses may override this routine to provide different behavior.
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id)1559 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1560 TypeSourceInfo *Declarator,
1561 SourceLocation StartLoc,
1562 SourceLocation IdLoc,
1563 IdentifierInfo *Id) {
1564 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1565 StartLoc, IdLoc, Id);
1566 if (Var)
1567 getSema().CurContext->addDecl(Var);
1568 return Var;
1569 }
1570
1571 /// \brief Build a new C++ catch statement.
1572 ///
1573 /// By default, performs semantic analysis to build the new statement.
1574 /// Subclasses may override this routine to provide different behavior.
RebuildCXXCatchStmt(SourceLocation CatchLoc,VarDecl * ExceptionDecl,Stmt * Handler)1575 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1576 VarDecl *ExceptionDecl,
1577 Stmt *Handler) {
1578 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1579 Handler));
1580 }
1581
1582 /// \brief Build a new C++ try statement.
1583 ///
1584 /// By default, performs semantic analysis to build the new statement.
1585 /// Subclasses may override this routine to provide different behavior.
RebuildCXXTryStmt(SourceLocation TryLoc,Stmt * TryBlock,ArrayRef<Stmt * > Handlers)1586 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1587 ArrayRef<Stmt *> Handlers) {
1588 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1589 }
1590
1591 /// \brief Build a new C++0x range-based for statement.
1592 ///
1593 /// By default, performs semantic analysis to build the new statement.
1594 /// Subclasses may override this routine to provide different behavior.
RebuildCXXForRangeStmt(SourceLocation ForLoc,SourceLocation ColonLoc,Stmt * Range,Stmt * BeginEnd,Expr * Cond,Expr * Inc,Stmt * LoopVar,SourceLocation RParenLoc)1595 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1596 SourceLocation ColonLoc,
1597 Stmt *Range, Stmt *BeginEnd,
1598 Expr *Cond, Expr *Inc,
1599 Stmt *LoopVar,
1600 SourceLocation RParenLoc) {
1601 // If we've just learned that the range is actually an Objective-C
1602 // collection, treat this as an Objective-C fast enumeration loop.
1603 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1604 if (RangeStmt->isSingleDecl()) {
1605 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1606 if (RangeVar->isInvalidDecl())
1607 return StmtError();
1608
1609 Expr *RangeExpr = RangeVar->getInit();
1610 if (!RangeExpr->isTypeDependent() &&
1611 RangeExpr->getType()->isObjCObjectPointerType())
1612 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1613 RParenLoc);
1614 }
1615 }
1616 }
1617
1618 return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
1619 Cond, Inc, LoopVar, RParenLoc,
1620 Sema::BFRK_Rebuild);
1621 }
1622
1623 /// \brief Build a new C++0x range-based for statement.
1624 ///
1625 /// By default, performs semantic analysis to build the new statement.
1626 /// Subclasses may override this routine to provide different behavior.
RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,NestedNameSpecifierLoc QualifierLoc,DeclarationNameInfo NameInfo,Stmt * Nested)1627 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1628 bool IsIfExists,
1629 NestedNameSpecifierLoc QualifierLoc,
1630 DeclarationNameInfo NameInfo,
1631 Stmt *Nested) {
1632 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1633 QualifierLoc, NameInfo, Nested);
1634 }
1635
1636 /// \brief Attach body to a C++0x range-based for statement.
1637 ///
1638 /// By default, performs semantic analysis to finish the new statement.
1639 /// Subclasses may override this routine to provide different behavior.
FinishCXXForRangeStmt(Stmt * ForRange,Stmt * Body)1640 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1641 return getSema().FinishCXXForRangeStmt(ForRange, Body);
1642 }
1643
RebuildSEHTryStmt(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)1644 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1645 Stmt *TryBlock, Stmt *Handler) {
1646 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1647 }
1648
RebuildSEHExceptStmt(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)1649 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1650 Stmt *Block) {
1651 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1652 }
1653
RebuildSEHFinallyStmt(SourceLocation Loc,Stmt * Block)1654 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1655 return getSema().ActOnSEHFinallyBlock(Loc, Block);
1656 }
1657
1658 /// \brief Build a new expression that references a declaration.
1659 ///
1660 /// By default, performs semantic analysis to build the new expression.
1661 /// Subclasses may override this routine to provide different behavior.
RebuildDeclarationNameExpr(const CXXScopeSpec & SS,LookupResult & R,bool RequiresADL)1662 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1663 LookupResult &R,
1664 bool RequiresADL) {
1665 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1666 }
1667
1668
1669 /// \brief Build a new expression that references a declaration.
1670 ///
1671 /// By default, performs semantic analysis to build the new expression.
1672 /// Subclasses may override this routine to provide different behavior.
RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,ValueDecl * VD,const DeclarationNameInfo & NameInfo,TemplateArgumentListInfo * TemplateArgs)1673 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1674 ValueDecl *VD,
1675 const DeclarationNameInfo &NameInfo,
1676 TemplateArgumentListInfo *TemplateArgs) {
1677 CXXScopeSpec SS;
1678 SS.Adopt(QualifierLoc);
1679
1680 // FIXME: loses template args.
1681
1682 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1683 }
1684
1685 /// \brief Build a new expression in parentheses.
1686 ///
1687 /// By default, performs semantic analysis to build the new expression.
1688 /// Subclasses may override this routine to provide different behavior.
RebuildParenExpr(Expr * SubExpr,SourceLocation LParen,SourceLocation RParen)1689 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1690 SourceLocation RParen) {
1691 return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1692 }
1693
1694 /// \brief Build a new pseudo-destructor expression.
1695 ///
1696 /// By default, performs semantic analysis to build the new expression.
1697 /// Subclasses may override this routine to provide different behavior.
1698 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1699 SourceLocation OperatorLoc,
1700 bool isArrow,
1701 CXXScopeSpec &SS,
1702 TypeSourceInfo *ScopeType,
1703 SourceLocation CCLoc,
1704 SourceLocation TildeLoc,
1705 PseudoDestructorTypeStorage Destroyed);
1706
1707 /// \brief Build a new unary operator expression.
1708 ///
1709 /// By default, performs semantic analysis to build the new expression.
1710 /// Subclasses may override this routine to provide different behavior.
RebuildUnaryOperator(SourceLocation OpLoc,UnaryOperatorKind Opc,Expr * SubExpr)1711 ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1712 UnaryOperatorKind Opc,
1713 Expr *SubExpr) {
1714 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
1715 }
1716
1717 /// \brief Build a new builtin offsetof expression.
1718 ///
1719 /// By default, performs semantic analysis to build the new expression.
1720 /// Subclasses may override this routine to provide different behavior.
RebuildOffsetOfExpr(SourceLocation OperatorLoc,TypeSourceInfo * Type,Sema::OffsetOfComponent * Components,unsigned NumComponents,SourceLocation RParenLoc)1721 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1722 TypeSourceInfo *Type,
1723 Sema::OffsetOfComponent *Components,
1724 unsigned NumComponents,
1725 SourceLocation RParenLoc) {
1726 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1727 NumComponents, RParenLoc);
1728 }
1729
1730 /// \brief Build a new sizeof, alignof or vec_step expression with a
1731 /// type argument.
1732 ///
1733 /// By default, performs semantic analysis to build the new expression.
1734 /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(TypeSourceInfo * TInfo,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)1735 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
1736 SourceLocation OpLoc,
1737 UnaryExprOrTypeTrait ExprKind,
1738 SourceRange R) {
1739 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
1740 }
1741
1742 /// \brief Build a new sizeof, alignof or vec step expression with an
1743 /// expression argument.
1744 ///
1745 /// By default, performs semantic analysis to build the new expression.
1746 /// Subclasses may override this routine to provide different behavior.
RebuildUnaryExprOrTypeTrait(Expr * SubExpr,SourceLocation OpLoc,UnaryExprOrTypeTrait ExprKind,SourceRange R)1747 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
1748 UnaryExprOrTypeTrait ExprKind,
1749 SourceRange R) {
1750 ExprResult Result
1751 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
1752 if (Result.isInvalid())
1753 return ExprError();
1754
1755 return Result;
1756 }
1757
1758 /// \brief Build a new array subscript expression.
1759 ///
1760 /// By default, performs semantic analysis to build the new expression.
1761 /// Subclasses may override this routine to provide different behavior.
RebuildArraySubscriptExpr(Expr * LHS,SourceLocation LBracketLoc,Expr * RHS,SourceLocation RBracketLoc)1762 ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1763 SourceLocation LBracketLoc,
1764 Expr *RHS,
1765 SourceLocation RBracketLoc) {
1766 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
1767 LBracketLoc, RHS,
1768 RBracketLoc);
1769 }
1770
1771 /// \brief Build a new call expression.
1772 ///
1773 /// By default, performs semantic analysis to build the new expression.
1774 /// Subclasses may override this routine to provide different behavior.
1775 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1776 MultiExprArg Args,
1777 SourceLocation RParenLoc,
1778 Expr *ExecConfig = nullptr) {
1779 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
1780 Args, RParenLoc, ExecConfig);
1781 }
1782
1783 /// \brief Build a new member access expression.
1784 ///
1785 /// By default, performs semantic analysis to build the new expression.
1786 /// 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)1787 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1788 bool isArrow,
1789 NestedNameSpecifierLoc QualifierLoc,
1790 SourceLocation TemplateKWLoc,
1791 const DeclarationNameInfo &MemberNameInfo,
1792 ValueDecl *Member,
1793 NamedDecl *FoundDecl,
1794 const TemplateArgumentListInfo *ExplicitTemplateArgs,
1795 NamedDecl *FirstQualifierInScope) {
1796 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
1797 isArrow);
1798 if (!Member->getDeclName()) {
1799 // We have a reference to an unnamed field. This is always the
1800 // base of an anonymous struct/union member access, i.e. the
1801 // field is always of record type.
1802 assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1803 assert(Member->getType()->isRecordType() &&
1804 "unnamed member not of record type?");
1805
1806 BaseResult =
1807 getSema().PerformObjectMemberConversion(BaseResult.get(),
1808 QualifierLoc.getNestedNameSpecifier(),
1809 FoundDecl, Member);
1810 if (BaseResult.isInvalid())
1811 return ExprError();
1812 Base = BaseResult.get();
1813 ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
1814 MemberExpr *ME =
1815 new (getSema().Context) MemberExpr(Base, isArrow,
1816 Member, MemberNameInfo,
1817 cast<FieldDecl>(Member)->getType(),
1818 VK, OK_Ordinary);
1819 return ME;
1820 }
1821
1822 CXXScopeSpec SS;
1823 SS.Adopt(QualifierLoc);
1824
1825 Base = BaseResult.get();
1826 QualType BaseType = Base->getType();
1827
1828 // FIXME: this involves duplicating earlier analysis in a lot of
1829 // cases; we should avoid this when possible.
1830 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
1831 R.addDecl(FoundDecl);
1832 R.resolveKind();
1833
1834 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1835 SS, TemplateKWLoc,
1836 FirstQualifierInScope,
1837 R, ExplicitTemplateArgs);
1838 }
1839
1840 /// \brief Build a new binary operator expression.
1841 ///
1842 /// By default, performs semantic analysis to build the new expression.
1843 /// Subclasses may override this routine to provide different behavior.
RebuildBinaryOperator(SourceLocation OpLoc,BinaryOperatorKind Opc,Expr * LHS,Expr * RHS)1844 ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1845 BinaryOperatorKind Opc,
1846 Expr *LHS, Expr *RHS) {
1847 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
1848 }
1849
1850 /// \brief Build a new conditional operator expression.
1851 ///
1852 /// By default, performs semantic analysis to build the new expression.
1853 /// Subclasses may override this routine to provide different behavior.
RebuildConditionalOperator(Expr * Cond,SourceLocation QuestionLoc,Expr * LHS,SourceLocation ColonLoc,Expr * RHS)1854 ExprResult RebuildConditionalOperator(Expr *Cond,
1855 SourceLocation QuestionLoc,
1856 Expr *LHS,
1857 SourceLocation ColonLoc,
1858 Expr *RHS) {
1859 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
1860 LHS, RHS);
1861 }
1862
1863 /// \brief Build a new C-style cast expression.
1864 ///
1865 /// By default, performs semantic analysis to build the new expression.
1866 /// Subclasses may override this routine to provide different behavior.
RebuildCStyleCastExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * SubExpr)1867 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
1868 TypeSourceInfo *TInfo,
1869 SourceLocation RParenLoc,
1870 Expr *SubExpr) {
1871 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1872 SubExpr);
1873 }
1874
1875 /// \brief Build a new compound literal expression.
1876 ///
1877 /// By default, performs semantic analysis to build the new expression.
1878 /// Subclasses may override this routine to provide different behavior.
RebuildCompoundLiteralExpr(SourceLocation LParenLoc,TypeSourceInfo * TInfo,SourceLocation RParenLoc,Expr * Init)1879 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1880 TypeSourceInfo *TInfo,
1881 SourceLocation RParenLoc,
1882 Expr *Init) {
1883 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1884 Init);
1885 }
1886
1887 /// \brief Build a new extended vector element access expression.
1888 ///
1889 /// By default, performs semantic analysis to build the new expression.
1890 /// Subclasses may override this routine to provide different behavior.
RebuildExtVectorElementExpr(Expr * Base,SourceLocation OpLoc,SourceLocation AccessorLoc,IdentifierInfo & Accessor)1891 ExprResult RebuildExtVectorElementExpr(Expr *Base,
1892 SourceLocation OpLoc,
1893 SourceLocation AccessorLoc,
1894 IdentifierInfo &Accessor) {
1895
1896 CXXScopeSpec SS;
1897 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
1898 return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1899 OpLoc, /*IsArrow*/ false,
1900 SS, SourceLocation(),
1901 /*FirstQualifierInScope*/ nullptr,
1902 NameInfo,
1903 /* TemplateArgs */ nullptr);
1904 }
1905
1906 /// \brief Build a new initializer list expression.
1907 ///
1908 /// By default, performs semantic analysis to build the new expression.
1909 /// Subclasses may override this routine to provide different behavior.
RebuildInitList(SourceLocation LBraceLoc,MultiExprArg Inits,SourceLocation RBraceLoc,QualType ResultTy)1910 ExprResult RebuildInitList(SourceLocation LBraceLoc,
1911 MultiExprArg Inits,
1912 SourceLocation RBraceLoc,
1913 QualType ResultTy) {
1914 ExprResult Result
1915 = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
1916 if (Result.isInvalid() || ResultTy->isDependentType())
1917 return Result;
1918
1919 // Patch in the result type we were given, which may have been computed
1920 // when the initial InitListExpr was built.
1921 InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1922 ILE->setType(ResultTy);
1923 return Result;
1924 }
1925
1926 /// \brief Build a new designated initializer expression.
1927 ///
1928 /// By default, performs semantic analysis to build the new expression.
1929 /// Subclasses may override this routine to provide different behavior.
RebuildDesignatedInitExpr(Designation & Desig,MultiExprArg ArrayExprs,SourceLocation EqualOrColonLoc,bool GNUSyntax,Expr * Init)1930 ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1931 MultiExprArg ArrayExprs,
1932 SourceLocation EqualOrColonLoc,
1933 bool GNUSyntax,
1934 Expr *Init) {
1935 ExprResult Result
1936 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1937 Init);
1938 if (Result.isInvalid())
1939 return ExprError();
1940
1941 return Result;
1942 }
1943
1944 /// \brief Build a new value-initialized expression.
1945 ///
1946 /// By default, builds the implicit value initialization without performing
1947 /// any semantic analysis. Subclasses may override this routine to provide
1948 /// different behavior.
RebuildImplicitValueInitExpr(QualType T)1949 ExprResult RebuildImplicitValueInitExpr(QualType T) {
1950 return new (SemaRef.Context) ImplicitValueInitExpr(T);
1951 }
1952
1953 /// \brief Build a new \c va_arg expression.
1954 ///
1955 /// By default, performs semantic analysis to build the new expression.
1956 /// Subclasses may override this routine to provide different behavior.
RebuildVAArgExpr(SourceLocation BuiltinLoc,Expr * SubExpr,TypeSourceInfo * TInfo,SourceLocation RParenLoc)1957 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
1958 Expr *SubExpr, TypeSourceInfo *TInfo,
1959 SourceLocation RParenLoc) {
1960 return getSema().BuildVAArgExpr(BuiltinLoc,
1961 SubExpr, TInfo,
1962 RParenLoc);
1963 }
1964
1965 /// \brief Build a new expression list in parentheses.
1966 ///
1967 /// By default, performs semantic analysis to build the new expression.
1968 /// Subclasses may override this routine to provide different behavior.
RebuildParenListExpr(SourceLocation LParenLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)1969 ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1970 MultiExprArg SubExprs,
1971 SourceLocation RParenLoc) {
1972 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
1973 }
1974
1975 /// \brief Build a new address-of-label expression.
1976 ///
1977 /// By default, performs semantic analysis, using the name of the label
1978 /// rather than attempting to map the label statement itself.
1979 /// Subclasses may override this routine to provide different behavior.
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,SourceLocation LabelLoc,LabelDecl * Label)1980 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1981 SourceLocation LabelLoc, LabelDecl *Label) {
1982 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
1983 }
1984
1985 /// \brief Build a new GNU statement expression.
1986 ///
1987 /// By default, performs semantic analysis to build the new expression.
1988 /// Subclasses may override this routine to provide different behavior.
RebuildStmtExpr(SourceLocation LParenLoc,Stmt * SubStmt,SourceLocation RParenLoc)1989 ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1990 Stmt *SubStmt,
1991 SourceLocation RParenLoc) {
1992 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1993 }
1994
1995 /// \brief Build a new __builtin_choose_expr expression.
1996 ///
1997 /// By default, performs semantic analysis to build the new expression.
1998 /// Subclasses may override this routine to provide different behavior.
RebuildChooseExpr(SourceLocation BuiltinLoc,Expr * Cond,Expr * LHS,Expr * RHS,SourceLocation RParenLoc)1999 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2000 Expr *Cond, Expr *LHS, Expr *RHS,
2001 SourceLocation RParenLoc) {
2002 return SemaRef.ActOnChooseExpr(BuiltinLoc,
2003 Cond, LHS, RHS,
2004 RParenLoc);
2005 }
2006
2007 /// \brief Build a new generic selection expression.
2008 ///
2009 /// By default, performs semantic analysis to build the new expression.
2010 /// Subclasses may override this routine to provide different behavior.
RebuildGenericSelectionExpr(SourceLocation KeyLoc,SourceLocation DefaultLoc,SourceLocation RParenLoc,Expr * ControllingExpr,ArrayRef<TypeSourceInfo * > Types,ArrayRef<Expr * > Exprs)2011 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2012 SourceLocation DefaultLoc,
2013 SourceLocation RParenLoc,
2014 Expr *ControllingExpr,
2015 ArrayRef<TypeSourceInfo *> Types,
2016 ArrayRef<Expr *> Exprs) {
2017 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2018 ControllingExpr, Types, Exprs);
2019 }
2020
2021 /// \brief Build a new overloaded operator call expression.
2022 ///
2023 /// By default, performs semantic analysis to build the new expression.
2024 /// The semantic analysis provides the behavior of template instantiation,
2025 /// copying with transformations that turn what looks like an overloaded
2026 /// operator call into a use of a builtin operator, performing
2027 /// argument-dependent lookup, etc. Subclasses may override this routine to
2028 /// provide different behavior.
2029 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2030 SourceLocation OpLoc,
2031 Expr *Callee,
2032 Expr *First,
2033 Expr *Second);
2034
2035 /// \brief Build a new C++ "named" cast expression, such as static_cast or
2036 /// reinterpret_cast.
2037 ///
2038 /// By default, this routine dispatches to one of the more-specific routines
2039 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2040 /// 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)2041 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2042 Stmt::StmtClass Class,
2043 SourceLocation LAngleLoc,
2044 TypeSourceInfo *TInfo,
2045 SourceLocation RAngleLoc,
2046 SourceLocation LParenLoc,
2047 Expr *SubExpr,
2048 SourceLocation RParenLoc) {
2049 switch (Class) {
2050 case Stmt::CXXStaticCastExprClass:
2051 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2052 RAngleLoc, LParenLoc,
2053 SubExpr, RParenLoc);
2054
2055 case Stmt::CXXDynamicCastExprClass:
2056 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2057 RAngleLoc, LParenLoc,
2058 SubExpr, RParenLoc);
2059
2060 case Stmt::CXXReinterpretCastExprClass:
2061 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2062 RAngleLoc, LParenLoc,
2063 SubExpr,
2064 RParenLoc);
2065
2066 case Stmt::CXXConstCastExprClass:
2067 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2068 RAngleLoc, LParenLoc,
2069 SubExpr, RParenLoc);
2070
2071 default:
2072 llvm_unreachable("Invalid C++ named cast");
2073 }
2074 }
2075
2076 /// \brief Build a new C++ static_cast expression.
2077 ///
2078 /// By default, performs semantic analysis to build the new expression.
2079 /// Subclasses may override this routine to provide different behavior.
RebuildCXXStaticCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2080 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2081 SourceLocation LAngleLoc,
2082 TypeSourceInfo *TInfo,
2083 SourceLocation RAngleLoc,
2084 SourceLocation LParenLoc,
2085 Expr *SubExpr,
2086 SourceLocation RParenLoc) {
2087 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2088 TInfo, SubExpr,
2089 SourceRange(LAngleLoc, RAngleLoc),
2090 SourceRange(LParenLoc, RParenLoc));
2091 }
2092
2093 /// \brief Build a new C++ dynamic_cast expression.
2094 ///
2095 /// By default, performs semantic analysis to build the new expression.
2096 /// Subclasses may override this routine to provide different behavior.
RebuildCXXDynamicCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2097 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2098 SourceLocation LAngleLoc,
2099 TypeSourceInfo *TInfo,
2100 SourceLocation RAngleLoc,
2101 SourceLocation LParenLoc,
2102 Expr *SubExpr,
2103 SourceLocation RParenLoc) {
2104 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2105 TInfo, SubExpr,
2106 SourceRange(LAngleLoc, RAngleLoc),
2107 SourceRange(LParenLoc, RParenLoc));
2108 }
2109
2110 /// \brief Build a new C++ reinterpret_cast expression.
2111 ///
2112 /// By default, performs semantic analysis to build the new expression.
2113 /// Subclasses may override this routine to provide different behavior.
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2114 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2115 SourceLocation LAngleLoc,
2116 TypeSourceInfo *TInfo,
2117 SourceLocation RAngleLoc,
2118 SourceLocation LParenLoc,
2119 Expr *SubExpr,
2120 SourceLocation RParenLoc) {
2121 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2122 TInfo, SubExpr,
2123 SourceRange(LAngleLoc, RAngleLoc),
2124 SourceRange(LParenLoc, RParenLoc));
2125 }
2126
2127 /// \brief Build a new C++ const_cast expression.
2128 ///
2129 /// By default, performs semantic analysis to build the new expression.
2130 /// Subclasses may override this routine to provide different behavior.
RebuildCXXConstCastExpr(SourceLocation OpLoc,SourceLocation LAngleLoc,TypeSourceInfo * TInfo,SourceLocation RAngleLoc,SourceLocation LParenLoc,Expr * SubExpr,SourceLocation RParenLoc)2131 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2132 SourceLocation LAngleLoc,
2133 TypeSourceInfo *TInfo,
2134 SourceLocation RAngleLoc,
2135 SourceLocation LParenLoc,
2136 Expr *SubExpr,
2137 SourceLocation RParenLoc) {
2138 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2139 TInfo, SubExpr,
2140 SourceRange(LAngleLoc, RAngleLoc),
2141 SourceRange(LParenLoc, RParenLoc));
2142 }
2143
2144 /// \brief Build a new C++ functional-style cast expression.
2145 ///
2146 /// By default, performs semantic analysis to build the new expression.
2147 /// Subclasses may override this routine to provide different behavior.
RebuildCXXFunctionalCastExpr(TypeSourceInfo * TInfo,SourceLocation LParenLoc,Expr * Sub,SourceLocation RParenLoc)2148 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2149 SourceLocation LParenLoc,
2150 Expr *Sub,
2151 SourceLocation RParenLoc) {
2152 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2153 MultiExprArg(&Sub, 1),
2154 RParenLoc);
2155 }
2156
2157 /// \brief Build a new C++ typeid(type) expression.
2158 ///
2159 /// By default, performs semantic analysis to build the new expression.
2160 /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2161 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2162 SourceLocation TypeidLoc,
2163 TypeSourceInfo *Operand,
2164 SourceLocation RParenLoc) {
2165 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2166 RParenLoc);
2167 }
2168
2169
2170 /// \brief Build a new C++ typeid(expr) expression.
2171 ///
2172 /// By default, performs semantic analysis to build the new expression.
2173 /// Subclasses may override this routine to provide different behavior.
RebuildCXXTypeidExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)2174 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2175 SourceLocation TypeidLoc,
2176 Expr *Operand,
2177 SourceLocation RParenLoc) {
2178 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2179 RParenLoc);
2180 }
2181
2182 /// \brief Build a new C++ __uuidof(type) expression.
2183 ///
2184 /// By default, performs semantic analysis to build the new expression.
2185 /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,TypeSourceInfo * Operand,SourceLocation RParenLoc)2186 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2187 SourceLocation TypeidLoc,
2188 TypeSourceInfo *Operand,
2189 SourceLocation RParenLoc) {
2190 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2191 RParenLoc);
2192 }
2193
2194 /// \brief Build a new C++ __uuidof(expr) expression.
2195 ///
2196 /// By default, performs semantic analysis to build the new expression.
2197 /// Subclasses may override this routine to provide different behavior.
RebuildCXXUuidofExpr(QualType TypeInfoType,SourceLocation TypeidLoc,Expr * Operand,SourceLocation RParenLoc)2198 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2199 SourceLocation TypeidLoc,
2200 Expr *Operand,
2201 SourceLocation RParenLoc) {
2202 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2203 RParenLoc);
2204 }
2205
2206 /// \brief Build a new C++ "this" expression.
2207 ///
2208 /// By default, builds a new "this" expression without performing any
2209 /// semantic analysis. Subclasses may override this routine to provide
2210 /// different behavior.
RebuildCXXThisExpr(SourceLocation ThisLoc,QualType ThisType,bool isImplicit)2211 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2212 QualType ThisType,
2213 bool isImplicit) {
2214 getSema().CheckCXXThisCapture(ThisLoc);
2215 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2216 }
2217
2218 /// \brief Build a new C++ throw expression.
2219 ///
2220 /// By default, performs semantic analysis to build the new expression.
2221 /// Subclasses may override this routine to provide different behavior.
RebuildCXXThrowExpr(SourceLocation ThrowLoc,Expr * Sub,bool IsThrownVariableInScope)2222 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2223 bool IsThrownVariableInScope) {
2224 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2225 }
2226
2227 /// \brief Build a new C++ default-argument expression.
2228 ///
2229 /// By default, builds a new default-argument expression, which does not
2230 /// require any semantic analysis. Subclasses may override this routine to
2231 /// provide different behavior.
RebuildCXXDefaultArgExpr(SourceLocation Loc,ParmVarDecl * Param)2232 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2233 ParmVarDecl *Param) {
2234 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2235 }
2236
2237 /// \brief Build a new C++11 default-initialization expression.
2238 ///
2239 /// By default, builds a new default field initialization expression, which
2240 /// does not require any semantic analysis. Subclasses may override this
2241 /// routine to provide different behavior.
RebuildCXXDefaultInitExpr(SourceLocation Loc,FieldDecl * Field)2242 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2243 FieldDecl *Field) {
2244 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2245 }
2246
2247 /// \brief Build a new C++ zero-initialization expression.
2248 ///
2249 /// By default, performs semantic analysis to build the new expression.
2250 /// Subclasses may override this routine to provide different behavior.
RebuildCXXScalarValueInitExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,SourceLocation RParenLoc)2251 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2252 SourceLocation LParenLoc,
2253 SourceLocation RParenLoc) {
2254 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2255 None, RParenLoc);
2256 }
2257
2258 /// \brief Build a new C++ "new" expression.
2259 ///
2260 /// By default, performs semantic analysis to build the new expression.
2261 /// 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)2262 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2263 bool UseGlobal,
2264 SourceLocation PlacementLParen,
2265 MultiExprArg PlacementArgs,
2266 SourceLocation PlacementRParen,
2267 SourceRange TypeIdParens,
2268 QualType AllocatedType,
2269 TypeSourceInfo *AllocatedTypeInfo,
2270 Expr *ArraySize,
2271 SourceRange DirectInitRange,
2272 Expr *Initializer) {
2273 return getSema().BuildCXXNew(StartLoc, UseGlobal,
2274 PlacementLParen,
2275 PlacementArgs,
2276 PlacementRParen,
2277 TypeIdParens,
2278 AllocatedType,
2279 AllocatedTypeInfo,
2280 ArraySize,
2281 DirectInitRange,
2282 Initializer);
2283 }
2284
2285 /// \brief Build a new C++ "delete" expression.
2286 ///
2287 /// By default, performs semantic analysis to build the new expression.
2288 /// Subclasses may override this routine to provide different behavior.
RebuildCXXDeleteExpr(SourceLocation StartLoc,bool IsGlobalDelete,bool IsArrayForm,Expr * Operand)2289 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2290 bool IsGlobalDelete,
2291 bool IsArrayForm,
2292 Expr *Operand) {
2293 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2294 Operand);
2295 }
2296
2297 /// \brief Build a new type trait expression.
2298 ///
2299 /// By default, performs semantic analysis to build the new expression.
2300 /// Subclasses may override this routine to provide different behavior.
RebuildTypeTrait(TypeTrait Trait,SourceLocation StartLoc,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc)2301 ExprResult RebuildTypeTrait(TypeTrait Trait,
2302 SourceLocation StartLoc,
2303 ArrayRef<TypeSourceInfo *> Args,
2304 SourceLocation RParenLoc) {
2305 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2306 }
2307
2308 /// \brief Build a new array type trait expression.
2309 ///
2310 /// By default, performs semantic analysis to build the new expression.
2311 /// Subclasses may override this routine to provide different behavior.
RebuildArrayTypeTrait(ArrayTypeTrait Trait,SourceLocation StartLoc,TypeSourceInfo * TSInfo,Expr * DimExpr,SourceLocation RParenLoc)2312 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2313 SourceLocation StartLoc,
2314 TypeSourceInfo *TSInfo,
2315 Expr *DimExpr,
2316 SourceLocation RParenLoc) {
2317 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2318 }
2319
2320 /// \brief Build a new expression trait expression.
2321 ///
2322 /// By default, performs semantic analysis to build the new expression.
2323 /// Subclasses may override this routine to provide different behavior.
RebuildExpressionTrait(ExpressionTrait Trait,SourceLocation StartLoc,Expr * Queried,SourceLocation RParenLoc)2324 ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2325 SourceLocation StartLoc,
2326 Expr *Queried,
2327 SourceLocation RParenLoc) {
2328 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2329 }
2330
2331 /// \brief Build a new (previously unresolved) declaration reference
2332 /// expression.
2333 ///
2334 /// By default, performs semantic analysis to build the new expression.
2335 /// Subclasses may override this routine to provide different behavior.
RebuildDependentScopeDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)2336 ExprResult RebuildDependentScopeDeclRefExpr(
2337 NestedNameSpecifierLoc QualifierLoc,
2338 SourceLocation TemplateKWLoc,
2339 const DeclarationNameInfo &NameInfo,
2340 const TemplateArgumentListInfo *TemplateArgs,
2341 bool IsAddressOfOperand,
2342 TypeSourceInfo **RecoveryTSI) {
2343 CXXScopeSpec SS;
2344 SS.Adopt(QualifierLoc);
2345
2346 if (TemplateArgs || TemplateKWLoc.isValid())
2347 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2348 TemplateArgs);
2349
2350 return getSema().BuildQualifiedDeclarationNameExpr(
2351 SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
2352 }
2353
2354 /// \brief Build a new template-id expression.
2355 ///
2356 /// By default, performs semantic analysis to build the new expression.
2357 /// Subclasses may override this routine to provide different behavior.
RebuildTemplateIdExpr(const CXXScopeSpec & SS,SourceLocation TemplateKWLoc,LookupResult & R,bool RequiresADL,const TemplateArgumentListInfo * TemplateArgs)2358 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2359 SourceLocation TemplateKWLoc,
2360 LookupResult &R,
2361 bool RequiresADL,
2362 const TemplateArgumentListInfo *TemplateArgs) {
2363 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2364 TemplateArgs);
2365 }
2366
2367 /// \brief Build a new object-construction expression.
2368 ///
2369 /// By default, performs semantic analysis to build the new expression.
2370 /// 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 RequiresZeroInit,CXXConstructExpr::ConstructionKind ConstructKind,SourceRange ParenRange)2371 ExprResult RebuildCXXConstructExpr(QualType T,
2372 SourceLocation Loc,
2373 CXXConstructorDecl *Constructor,
2374 bool IsElidable,
2375 MultiExprArg Args,
2376 bool HadMultipleCandidates,
2377 bool ListInitialization,
2378 bool RequiresZeroInit,
2379 CXXConstructExpr::ConstructionKind ConstructKind,
2380 SourceRange ParenRange) {
2381 SmallVector<Expr*, 8> ConvertedArgs;
2382 if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2383 ConvertedArgs))
2384 return ExprError();
2385
2386 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
2387 ConvertedArgs,
2388 HadMultipleCandidates,
2389 ListInitialization,
2390 RequiresZeroInit, ConstructKind,
2391 ParenRange);
2392 }
2393
2394 /// \brief Build a new object-construction expression.
2395 ///
2396 /// By default, performs semantic analysis to build the new expression.
2397 /// Subclasses may override this routine to provide different behavior.
RebuildCXXTemporaryObjectExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2398 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2399 SourceLocation LParenLoc,
2400 MultiExprArg Args,
2401 SourceLocation RParenLoc) {
2402 return getSema().BuildCXXTypeConstructExpr(TSInfo,
2403 LParenLoc,
2404 Args,
2405 RParenLoc);
2406 }
2407
2408 /// \brief Build a new object-construction expression.
2409 ///
2410 /// By default, performs semantic analysis to build the new expression.
2411 /// Subclasses may override this routine to provide different behavior.
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo * TSInfo,SourceLocation LParenLoc,MultiExprArg Args,SourceLocation RParenLoc)2412 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2413 SourceLocation LParenLoc,
2414 MultiExprArg Args,
2415 SourceLocation RParenLoc) {
2416 return getSema().BuildCXXTypeConstructExpr(TSInfo,
2417 LParenLoc,
2418 Args,
2419 RParenLoc);
2420 }
2421
2422 /// \brief Build a new member reference expression.
2423 ///
2424 /// By default, performs semantic analysis to build the new expression.
2425 /// 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)2426 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2427 QualType BaseType,
2428 bool IsArrow,
2429 SourceLocation OperatorLoc,
2430 NestedNameSpecifierLoc QualifierLoc,
2431 SourceLocation TemplateKWLoc,
2432 NamedDecl *FirstQualifierInScope,
2433 const DeclarationNameInfo &MemberNameInfo,
2434 const TemplateArgumentListInfo *TemplateArgs) {
2435 CXXScopeSpec SS;
2436 SS.Adopt(QualifierLoc);
2437
2438 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2439 OperatorLoc, IsArrow,
2440 SS, TemplateKWLoc,
2441 FirstQualifierInScope,
2442 MemberNameInfo,
2443 TemplateArgs);
2444 }
2445
2446 /// \brief Build a new member reference expression.
2447 ///
2448 /// By default, performs semantic analysis to build the new expression.
2449 /// 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)2450 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2451 SourceLocation OperatorLoc,
2452 bool IsArrow,
2453 NestedNameSpecifierLoc QualifierLoc,
2454 SourceLocation TemplateKWLoc,
2455 NamedDecl *FirstQualifierInScope,
2456 LookupResult &R,
2457 const TemplateArgumentListInfo *TemplateArgs) {
2458 CXXScopeSpec SS;
2459 SS.Adopt(QualifierLoc);
2460
2461 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2462 OperatorLoc, IsArrow,
2463 SS, TemplateKWLoc,
2464 FirstQualifierInScope,
2465 R, TemplateArgs);
2466 }
2467
2468 /// \brief Build a new noexcept expression.
2469 ///
2470 /// By default, performs semantic analysis to build the new expression.
2471 /// Subclasses may override this routine to provide different behavior.
RebuildCXXNoexceptExpr(SourceRange Range,Expr * Arg)2472 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2473 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2474 }
2475
2476 /// \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)2477 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
2478 SourceLocation PackLoc,
2479 SourceLocation RParenLoc,
2480 Optional<unsigned> Length) {
2481 if (Length)
2482 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2483 OperatorLoc, Pack, PackLoc,
2484 RParenLoc, *Length);
2485
2486 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2487 OperatorLoc, Pack, PackLoc,
2488 RParenLoc);
2489 }
2490
2491 /// \brief Build a new Objective-C boxed expression.
2492 ///
2493 /// By default, performs semantic analysis to build the new expression.
2494 /// Subclasses may override this routine to provide different behavior.
RebuildObjCBoxedExpr(SourceRange SR,Expr * ValueExpr)2495 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2496 return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2497 }
2498
2499 /// \brief Build a new Objective-C array literal.
2500 ///
2501 /// By default, performs semantic analysis to build the new expression.
2502 /// Subclasses may override this routine to provide different behavior.
RebuildObjCArrayLiteral(SourceRange Range,Expr ** Elements,unsigned NumElements)2503 ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2504 Expr **Elements, unsigned NumElements) {
2505 return getSema().BuildObjCArrayLiteral(Range,
2506 MultiExprArg(Elements, NumElements));
2507 }
2508
RebuildObjCSubscriptRefExpr(SourceLocation RB,Expr * Base,Expr * Key,ObjCMethodDecl * getterMethod,ObjCMethodDecl * setterMethod)2509 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2510 Expr *Base, Expr *Key,
2511 ObjCMethodDecl *getterMethod,
2512 ObjCMethodDecl *setterMethod) {
2513 return getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2514 getterMethod, setterMethod);
2515 }
2516
2517 /// \brief Build a new Objective-C dictionary literal.
2518 ///
2519 /// By default, performs semantic analysis to build the new expression.
2520 /// Subclasses may override this routine to provide different behavior.
RebuildObjCDictionaryLiteral(SourceRange Range,ObjCDictionaryElement * Elements,unsigned NumElements)2521 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2522 ObjCDictionaryElement *Elements,
2523 unsigned NumElements) {
2524 return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements);
2525 }
2526
2527 /// \brief Build a new Objective-C \@encode expression.
2528 ///
2529 /// By default, performs semantic analysis to build the new expression.
2530 /// Subclasses may override this routine to provide different behavior.
RebuildObjCEncodeExpr(SourceLocation AtLoc,TypeSourceInfo * EncodeTypeInfo,SourceLocation RParenLoc)2531 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2532 TypeSourceInfo *EncodeTypeInfo,
2533 SourceLocation RParenLoc) {
2534 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2535 }
2536
2537 /// \brief Build a new Objective-C class message.
RebuildObjCMessageExpr(TypeSourceInfo * ReceiverTypeInfo,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2538 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2539 Selector Sel,
2540 ArrayRef<SourceLocation> SelectorLocs,
2541 ObjCMethodDecl *Method,
2542 SourceLocation LBracLoc,
2543 MultiExprArg Args,
2544 SourceLocation RBracLoc) {
2545 return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2546 ReceiverTypeInfo->getType(),
2547 /*SuperLoc=*/SourceLocation(),
2548 Sel, Method, LBracLoc, SelectorLocs,
2549 RBracLoc, Args);
2550 }
2551
2552 /// \brief Build a new Objective-C instance message.
RebuildObjCMessageExpr(Expr * Receiver,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,SourceLocation LBracLoc,MultiExprArg Args,SourceLocation RBracLoc)2553 ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2554 Selector Sel,
2555 ArrayRef<SourceLocation> SelectorLocs,
2556 ObjCMethodDecl *Method,
2557 SourceLocation LBracLoc,
2558 MultiExprArg Args,
2559 SourceLocation RBracLoc) {
2560 return SemaRef.BuildInstanceMessage(Receiver,
2561 Receiver->getType(),
2562 /*SuperLoc=*/SourceLocation(),
2563 Sel, Method, LBracLoc, SelectorLocs,
2564 RBracLoc, Args);
2565 }
2566
2567 /// \brief Build a new Objective-C ivar reference expression.
2568 ///
2569 /// By default, performs semantic analysis to build the new expression.
2570 /// Subclasses may override this routine to provide different behavior.
RebuildObjCIvarRefExpr(Expr * BaseArg,ObjCIvarDecl * Ivar,SourceLocation IvarLoc,bool IsArrow,bool IsFreeIvar)2571 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2572 SourceLocation IvarLoc,
2573 bool IsArrow, bool IsFreeIvar) {
2574 // FIXME: We lose track of the IsFreeIvar bit.
2575 CXXScopeSpec SS;
2576 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2577 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2578 /*FIXME:*/IvarLoc, IsArrow,
2579 SS, SourceLocation(),
2580 /*FirstQualifierInScope=*/nullptr,
2581 NameInfo,
2582 /*TemplateArgs=*/nullptr);
2583 }
2584
2585 /// \brief Build a new Objective-C property reference expression.
2586 ///
2587 /// By default, performs semantic analysis to build the new expression.
2588 /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * BaseArg,ObjCPropertyDecl * Property,SourceLocation PropertyLoc)2589 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2590 ObjCPropertyDecl *Property,
2591 SourceLocation PropertyLoc) {
2592 CXXScopeSpec SS;
2593 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2594 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2595 /*FIXME:*/PropertyLoc,
2596 /*IsArrow=*/false,
2597 SS, SourceLocation(),
2598 /*FirstQualifierInScope=*/nullptr,
2599 NameInfo,
2600 /*TemplateArgs=*/nullptr);
2601 }
2602
2603 /// \brief Build a new Objective-C property reference expression.
2604 ///
2605 /// By default, performs semantic analysis to build the new expression.
2606 /// Subclasses may override this routine to provide different behavior.
RebuildObjCPropertyRefExpr(Expr * Base,QualType T,ObjCMethodDecl * Getter,ObjCMethodDecl * Setter,SourceLocation PropertyLoc)2607 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2608 ObjCMethodDecl *Getter,
2609 ObjCMethodDecl *Setter,
2610 SourceLocation PropertyLoc) {
2611 // Since these expressions can only be value-dependent, we do not
2612 // need to perform semantic analysis again.
2613 return Owned(
2614 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2615 VK_LValue, OK_ObjCProperty,
2616 PropertyLoc, Base));
2617 }
2618
2619 /// \brief Build a new Objective-C "isa" expression.
2620 ///
2621 /// By default, performs semantic analysis to build the new expression.
2622 /// Subclasses may override this routine to provide different behavior.
RebuildObjCIsaExpr(Expr * BaseArg,SourceLocation IsaLoc,SourceLocation OpLoc,bool IsArrow)2623 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2624 SourceLocation OpLoc, bool IsArrow) {
2625 CXXScopeSpec SS;
2626 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2627 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2628 OpLoc, IsArrow,
2629 SS, SourceLocation(),
2630 /*FirstQualifierInScope=*/nullptr,
2631 NameInfo,
2632 /*TemplateArgs=*/nullptr);
2633 }
2634
2635 /// \brief Build a new shuffle vector expression.
2636 ///
2637 /// By default, performs semantic analysis to build the new expression.
2638 /// Subclasses may override this routine to provide different behavior.
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,SourceLocation RParenLoc)2639 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2640 MultiExprArg SubExprs,
2641 SourceLocation RParenLoc) {
2642 // Find the declaration for __builtin_shufflevector
2643 const IdentifierInfo &Name
2644 = SemaRef.Context.Idents.get("__builtin_shufflevector");
2645 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2646 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2647 assert(!Lookup.empty() && "No __builtin_shufflevector?");
2648
2649 // Build a reference to the __builtin_shufflevector builtin
2650 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
2651 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
2652 SemaRef.Context.BuiltinFnTy,
2653 VK_RValue, BuiltinLoc);
2654 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
2655 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
2656 CK_BuiltinFnToFnPtr).get();
2657
2658 // Build the CallExpr
2659 ExprResult TheCall = new (SemaRef.Context) CallExpr(
2660 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
2661 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
2662
2663 // Type-check the __builtin_shufflevector expression.
2664 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
2665 }
2666
2667 /// \brief Build a new convert vector expression.
RebuildConvertVectorExpr(SourceLocation BuiltinLoc,Expr * SrcExpr,TypeSourceInfo * DstTInfo,SourceLocation RParenLoc)2668 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
2669 Expr *SrcExpr, TypeSourceInfo *DstTInfo,
2670 SourceLocation RParenLoc) {
2671 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
2672 BuiltinLoc, RParenLoc);
2673 }
2674
2675 /// \brief Build a new template argument pack expansion.
2676 ///
2677 /// By default, performs semantic analysis to build a new pack expansion
2678 /// for a template argument. Subclasses may override this routine to provide
2679 /// different behavior.
RebuildPackExpansion(TemplateArgumentLoc Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)2680 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2681 SourceLocation EllipsisLoc,
2682 Optional<unsigned> NumExpansions) {
2683 switch (Pattern.getArgument().getKind()) {
2684 case TemplateArgument::Expression: {
2685 ExprResult Result
2686 = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
2687 EllipsisLoc, NumExpansions);
2688 if (Result.isInvalid())
2689 return TemplateArgumentLoc();
2690
2691 return TemplateArgumentLoc(Result.get(), Result.get());
2692 }
2693
2694 case TemplateArgument::Template:
2695 return TemplateArgumentLoc(TemplateArgument(
2696 Pattern.getArgument().getAsTemplate(),
2697 NumExpansions),
2698 Pattern.getTemplateQualifierLoc(),
2699 Pattern.getTemplateNameLoc(),
2700 EllipsisLoc);
2701
2702 case TemplateArgument::Null:
2703 case TemplateArgument::Integral:
2704 case TemplateArgument::Declaration:
2705 case TemplateArgument::Pack:
2706 case TemplateArgument::TemplateExpansion:
2707 case TemplateArgument::NullPtr:
2708 llvm_unreachable("Pack expansion pattern has no parameter packs");
2709
2710 case TemplateArgument::Type:
2711 if (TypeSourceInfo *Expansion
2712 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2713 EllipsisLoc,
2714 NumExpansions))
2715 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
2716 Expansion);
2717 break;
2718 }
2719
2720 return TemplateArgumentLoc();
2721 }
2722
2723 /// \brief Build a new expression pack expansion.
2724 ///
2725 /// By default, performs semantic analysis to build a new pack expansion
2726 /// for an expression. Subclasses may override this routine to provide
2727 /// different behavior.
RebuildPackExpansion(Expr * Pattern,SourceLocation EllipsisLoc,Optional<unsigned> NumExpansions)2728 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
2729 Optional<unsigned> NumExpansions) {
2730 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2731 }
2732
2733 /// \brief Build a new atomic operation expression.
2734 ///
2735 /// By default, performs semantic analysis to build the new expression.
2736 /// Subclasses may override this routine to provide different behavior.
RebuildAtomicExpr(SourceLocation BuiltinLoc,MultiExprArg SubExprs,QualType RetTy,AtomicExpr::AtomicOp Op,SourceLocation RParenLoc)2737 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
2738 MultiExprArg SubExprs,
2739 QualType RetTy,
2740 AtomicExpr::AtomicOp Op,
2741 SourceLocation RParenLoc) {
2742 // Just create the expression; there is not any interesting semantic
2743 // analysis here because we can't actually build an AtomicExpr until
2744 // we are sure it is semantically sound.
2745 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
2746 RParenLoc);
2747 }
2748
2749 private:
2750 TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2751 QualType ObjectType,
2752 NamedDecl *FirstQualifierInScope,
2753 CXXScopeSpec &SS);
2754
2755 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2756 QualType ObjectType,
2757 NamedDecl *FirstQualifierInScope,
2758 CXXScopeSpec &SS);
2759
2760 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
2761 NamedDecl *FirstQualifierInScope,
2762 CXXScopeSpec &SS);
2763 };
2764
2765 template<typename Derived>
TransformStmt(Stmt * S)2766 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
2767 if (!S)
2768 return S;
2769
2770 switch (S->getStmtClass()) {
2771 case Stmt::NoStmtClass: break;
2772
2773 // Transform individual statement nodes
2774 #define STMT(Node, Parent) \
2775 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
2776 #define ABSTRACT_STMT(Node)
2777 #define EXPR(Node, Parent)
2778 #include "clang/AST/StmtNodes.inc"
2779
2780 // Transform expressions by calling TransformExpr.
2781 #define STMT(Node, Parent)
2782 #define ABSTRACT_STMT(Stmt)
2783 #define EXPR(Node, Parent) case Stmt::Node##Class:
2784 #include "clang/AST/StmtNodes.inc"
2785 {
2786 ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
2787 if (E.isInvalid())
2788 return StmtError();
2789
2790 return getSema().ActOnExprStmt(E);
2791 }
2792 }
2793
2794 return S;
2795 }
2796
2797 template<typename Derived>
TransformOMPClause(OMPClause * S)2798 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
2799 if (!S)
2800 return S;
2801
2802 switch (S->getClauseKind()) {
2803 default: break;
2804 // Transform individual clause nodes
2805 #define OPENMP_CLAUSE(Name, Class) \
2806 case OMPC_ ## Name : \
2807 return getDerived().Transform ## Class(cast<Class>(S));
2808 #include "clang/Basic/OpenMPKinds.def"
2809 }
2810
2811 return S;
2812 }
2813
2814
2815 template<typename Derived>
TransformExpr(Expr * E)2816 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2817 if (!E)
2818 return E;
2819
2820 switch (E->getStmtClass()) {
2821 case Stmt::NoStmtClass: break;
2822 #define STMT(Node, Parent) case Stmt::Node##Class: break;
2823 #define ABSTRACT_STMT(Stmt)
2824 #define EXPR(Node, Parent) \
2825 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
2826 #include "clang/AST/StmtNodes.inc"
2827 }
2828
2829 return E;
2830 }
2831
2832 template<typename Derived>
TransformInitializer(Expr * Init,bool CXXDirectInit)2833 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
2834 bool CXXDirectInit) {
2835 // Initializers are instantiated like expressions, except that various outer
2836 // layers are stripped.
2837 if (!Init)
2838 return Init;
2839
2840 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
2841 Init = ExprTemp->getSubExpr();
2842
2843 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
2844 Init = MTE->GetTemporaryExpr();
2845
2846 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
2847 Init = Binder->getSubExpr();
2848
2849 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
2850 Init = ICE->getSubExprAsWritten();
2851
2852 if (CXXStdInitializerListExpr *ILE =
2853 dyn_cast<CXXStdInitializerListExpr>(Init))
2854 return TransformInitializer(ILE->getSubExpr(), CXXDirectInit);
2855
2856 // If this is not a direct-initializer, we only need to reconstruct
2857 // InitListExprs. Other forms of copy-initialization will be a no-op if
2858 // the initializer is already the right type.
2859 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
2860 if (!CXXDirectInit && !(Construct && Construct->isListInitialization()))
2861 return getDerived().TransformExpr(Init);
2862
2863 // Revert value-initialization back to empty parens.
2864 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
2865 SourceRange Parens = VIE->getSourceRange();
2866 return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
2867 Parens.getEnd());
2868 }
2869
2870 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
2871 if (isa<ImplicitValueInitExpr>(Init))
2872 return getDerived().RebuildParenListExpr(SourceLocation(), None,
2873 SourceLocation());
2874
2875 // Revert initialization by constructor back to a parenthesized or braced list
2876 // of expressions. Any other form of initializer can just be reused directly.
2877 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
2878 return getDerived().TransformExpr(Init);
2879
2880 SmallVector<Expr*, 8> NewArgs;
2881 bool ArgChanged = false;
2882 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
2883 /*IsCall*/true, NewArgs, &ArgChanged))
2884 return ExprError();
2885
2886 // If this was list initialization, revert to list form.
2887 if (Construct->isListInitialization())
2888 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
2889 Construct->getLocEnd(),
2890 Construct->getType());
2891
2892 // Build a ParenListExpr to represent anything else.
2893 SourceRange Parens = Construct->getParenOrBraceRange();
2894 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
2895 Parens.getEnd());
2896 }
2897
2898 template<typename Derived>
TransformExprs(Expr ** Inputs,unsigned NumInputs,bool IsCall,SmallVectorImpl<Expr * > & Outputs,bool * ArgChanged)2899 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
2900 unsigned NumInputs,
2901 bool IsCall,
2902 SmallVectorImpl<Expr *> &Outputs,
2903 bool *ArgChanged) {
2904 for (unsigned I = 0; I != NumInputs; ++I) {
2905 // If requested, drop call arguments that need to be dropped.
2906 if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
2907 if (ArgChanged)
2908 *ArgChanged = true;
2909
2910 break;
2911 }
2912
2913 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
2914 Expr *Pattern = Expansion->getPattern();
2915
2916 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2917 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
2918 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
2919
2920 // Determine whether the set of unexpanded parameter packs can and should
2921 // be expanded.
2922 bool Expand = true;
2923 bool RetainExpansion = false;
2924 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
2925 Optional<unsigned> NumExpansions = OrigNumExpansions;
2926 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
2927 Pattern->getSourceRange(),
2928 Unexpanded,
2929 Expand, RetainExpansion,
2930 NumExpansions))
2931 return true;
2932
2933 if (!Expand) {
2934 // The transform has determined that we should perform a simple
2935 // transformation on the pack expansion, producing another pack
2936 // expansion.
2937 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
2938 ExprResult OutPattern = getDerived().TransformExpr(Pattern);
2939 if (OutPattern.isInvalid())
2940 return true;
2941
2942 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
2943 Expansion->getEllipsisLoc(),
2944 NumExpansions);
2945 if (Out.isInvalid())
2946 return true;
2947
2948 if (ArgChanged)
2949 *ArgChanged = true;
2950 Outputs.push_back(Out.get());
2951 continue;
2952 }
2953
2954 // Record right away that the argument was changed. This needs
2955 // to happen even if the array expands to nothing.
2956 if (ArgChanged) *ArgChanged = true;
2957
2958 // The transform has determined that we should perform an elementwise
2959 // expansion of the pattern. Do so.
2960 for (unsigned I = 0; I != *NumExpansions; ++I) {
2961 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
2962 ExprResult Out = getDerived().TransformExpr(Pattern);
2963 if (Out.isInvalid())
2964 return true;
2965
2966 // FIXME: Can this happen? We should not try to expand the pack
2967 // in this case.
2968 if (Out.get()->containsUnexpandedParameterPack()) {
2969 Out = getDerived().RebuildPackExpansion(
2970 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
2971 if (Out.isInvalid())
2972 return true;
2973 }
2974
2975 Outputs.push_back(Out.get());
2976 }
2977
2978 // If we're supposed to retain a pack expansion, do so by temporarily
2979 // forgetting the partially-substituted parameter pack.
2980 if (RetainExpansion) {
2981 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
2982
2983 ExprResult Out = getDerived().TransformExpr(Pattern);
2984 if (Out.isInvalid())
2985 return true;
2986
2987 Out = getDerived().RebuildPackExpansion(
2988 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
2989 if (Out.isInvalid())
2990 return true;
2991
2992 Outputs.push_back(Out.get());
2993 }
2994
2995 continue;
2996 }
2997
2998 ExprResult Result =
2999 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3000 : getDerived().TransformExpr(Inputs[I]);
3001 if (Result.isInvalid())
3002 return true;
3003
3004 if (Result.get() != Inputs[I] && ArgChanged)
3005 *ArgChanged = true;
3006
3007 Outputs.push_back(Result.get());
3008 }
3009
3010 return false;
3011 }
3012
3013 template<typename Derived>
3014 NestedNameSpecifierLoc
TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,QualType ObjectType,NamedDecl * FirstQualifierInScope)3015 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3016 NestedNameSpecifierLoc NNS,
3017 QualType ObjectType,
3018 NamedDecl *FirstQualifierInScope) {
3019 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3020 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3021 Qualifier = Qualifier.getPrefix())
3022 Qualifiers.push_back(Qualifier);
3023
3024 CXXScopeSpec SS;
3025 while (!Qualifiers.empty()) {
3026 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3027 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3028
3029 switch (QNNS->getKind()) {
3030 case NestedNameSpecifier::Identifier:
3031 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr,
3032 *QNNS->getAsIdentifier(),
3033 Q.getLocalBeginLoc(),
3034 Q.getLocalEndLoc(),
3035 ObjectType, false, SS,
3036 FirstQualifierInScope, false))
3037 return NestedNameSpecifierLoc();
3038
3039 break;
3040
3041 case NestedNameSpecifier::Namespace: {
3042 NamespaceDecl *NS
3043 = cast_or_null<NamespaceDecl>(
3044 getDerived().TransformDecl(
3045 Q.getLocalBeginLoc(),
3046 QNNS->getAsNamespace()));
3047 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3048 break;
3049 }
3050
3051 case NestedNameSpecifier::NamespaceAlias: {
3052 NamespaceAliasDecl *Alias
3053 = cast_or_null<NamespaceAliasDecl>(
3054 getDerived().TransformDecl(Q.getLocalBeginLoc(),
3055 QNNS->getAsNamespaceAlias()));
3056 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3057 Q.getLocalEndLoc());
3058 break;
3059 }
3060
3061 case NestedNameSpecifier::Global:
3062 // There is no meaningful transformation that one could perform on the
3063 // global scope.
3064 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3065 break;
3066
3067 case NestedNameSpecifier::TypeSpecWithTemplate:
3068 case NestedNameSpecifier::TypeSpec: {
3069 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3070 FirstQualifierInScope, SS);
3071
3072 if (!TL)
3073 return NestedNameSpecifierLoc();
3074
3075 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3076 (SemaRef.getLangOpts().CPlusPlus11 &&
3077 TL.getType()->isEnumeralType())) {
3078 assert(!TL.getType().hasLocalQualifiers() &&
3079 "Can't get cv-qualifiers here");
3080 if (TL.getType()->isEnumeralType())
3081 SemaRef.Diag(TL.getBeginLoc(),
3082 diag::warn_cxx98_compat_enum_nested_name_spec);
3083 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3084 Q.getLocalEndLoc());
3085 break;
3086 }
3087 // If the nested-name-specifier is an invalid type def, don't emit an
3088 // error because a previous error should have already been emitted.
3089 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3090 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3091 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3092 << TL.getType() << SS.getRange();
3093 }
3094 return NestedNameSpecifierLoc();
3095 }
3096 }
3097
3098 // The qualifier-in-scope and object type only apply to the leftmost entity.
3099 FirstQualifierInScope = nullptr;
3100 ObjectType = QualType();
3101 }
3102
3103 // Don't rebuild the nested-name-specifier if we don't have to.
3104 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3105 !getDerived().AlwaysRebuild())
3106 return NNS;
3107
3108 // If we can re-use the source-location data from the original
3109 // nested-name-specifier, do so.
3110 if (SS.location_size() == NNS.getDataLength() &&
3111 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3112 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3113
3114 // Allocate new nested-name-specifier location information.
3115 return SS.getWithLocInContext(SemaRef.Context);
3116 }
3117
3118 template<typename Derived>
3119 DeclarationNameInfo
3120 TreeTransform<Derived>
TransformDeclarationNameInfo(const DeclarationNameInfo & NameInfo)3121 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3122 DeclarationName Name = NameInfo.getName();
3123 if (!Name)
3124 return DeclarationNameInfo();
3125
3126 switch (Name.getNameKind()) {
3127 case DeclarationName::Identifier:
3128 case DeclarationName::ObjCZeroArgSelector:
3129 case DeclarationName::ObjCOneArgSelector:
3130 case DeclarationName::ObjCMultiArgSelector:
3131 case DeclarationName::CXXOperatorName:
3132 case DeclarationName::CXXLiteralOperatorName:
3133 case DeclarationName::CXXUsingDirective:
3134 return NameInfo;
3135
3136 case DeclarationName::CXXConstructorName:
3137 case DeclarationName::CXXDestructorName:
3138 case DeclarationName::CXXConversionFunctionName: {
3139 TypeSourceInfo *NewTInfo;
3140 CanQualType NewCanTy;
3141 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3142 NewTInfo = getDerived().TransformType(OldTInfo);
3143 if (!NewTInfo)
3144 return DeclarationNameInfo();
3145 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3146 }
3147 else {
3148 NewTInfo = nullptr;
3149 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3150 QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3151 if (NewT.isNull())
3152 return DeclarationNameInfo();
3153 NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3154 }
3155
3156 DeclarationName NewName
3157 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3158 NewCanTy);
3159 DeclarationNameInfo NewNameInfo(NameInfo);
3160 NewNameInfo.setName(NewName);
3161 NewNameInfo.setNamedTypeInfo(NewTInfo);
3162 return NewNameInfo;
3163 }
3164 }
3165
3166 llvm_unreachable("Unknown name kind.");
3167 }
3168
3169 template<typename Derived>
3170 TemplateName
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)3171 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3172 TemplateName Name,
3173 SourceLocation NameLoc,
3174 QualType ObjectType,
3175 NamedDecl *FirstQualifierInScope) {
3176 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3177 TemplateDecl *Template = QTN->getTemplateDecl();
3178 assert(Template && "qualified template name must refer to a template");
3179
3180 TemplateDecl *TransTemplate
3181 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3182 Template));
3183 if (!TransTemplate)
3184 return TemplateName();
3185
3186 if (!getDerived().AlwaysRebuild() &&
3187 SS.getScopeRep() == QTN->getQualifier() &&
3188 TransTemplate == Template)
3189 return Name;
3190
3191 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3192 TransTemplate);
3193 }
3194
3195 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3196 if (SS.getScopeRep()) {
3197 // These apply to the scope specifier, not the template.
3198 ObjectType = QualType();
3199 FirstQualifierInScope = nullptr;
3200 }
3201
3202 if (!getDerived().AlwaysRebuild() &&
3203 SS.getScopeRep() == DTN->getQualifier() &&
3204 ObjectType.isNull())
3205 return Name;
3206
3207 if (DTN->isIdentifier()) {
3208 return getDerived().RebuildTemplateName(SS,
3209 *DTN->getIdentifier(),
3210 NameLoc,
3211 ObjectType,
3212 FirstQualifierInScope);
3213 }
3214
3215 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3216 ObjectType);
3217 }
3218
3219 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3220 TemplateDecl *TransTemplate
3221 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3222 Template));
3223 if (!TransTemplate)
3224 return TemplateName();
3225
3226 if (!getDerived().AlwaysRebuild() &&
3227 TransTemplate == Template)
3228 return Name;
3229
3230 return TemplateName(TransTemplate);
3231 }
3232
3233 if (SubstTemplateTemplateParmPackStorage *SubstPack
3234 = Name.getAsSubstTemplateTemplateParmPack()) {
3235 TemplateTemplateParmDecl *TransParam
3236 = cast_or_null<TemplateTemplateParmDecl>(
3237 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3238 if (!TransParam)
3239 return TemplateName();
3240
3241 if (!getDerived().AlwaysRebuild() &&
3242 TransParam == SubstPack->getParameterPack())
3243 return Name;
3244
3245 return getDerived().RebuildTemplateName(TransParam,
3246 SubstPack->getArgumentPack());
3247 }
3248
3249 // These should be getting filtered out before they reach the AST.
3250 llvm_unreachable("overloaded function decl survived to here");
3251 }
3252
3253 template<typename Derived>
InventTemplateArgumentLoc(const TemplateArgument & Arg,TemplateArgumentLoc & Output)3254 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3255 const TemplateArgument &Arg,
3256 TemplateArgumentLoc &Output) {
3257 SourceLocation Loc = getDerived().getBaseLocation();
3258 switch (Arg.getKind()) {
3259 case TemplateArgument::Null:
3260 llvm_unreachable("null template argument in TreeTransform");
3261 break;
3262
3263 case TemplateArgument::Type:
3264 Output = TemplateArgumentLoc(Arg,
3265 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3266
3267 break;
3268
3269 case TemplateArgument::Template:
3270 case TemplateArgument::TemplateExpansion: {
3271 NestedNameSpecifierLocBuilder Builder;
3272 TemplateName Template = Arg.getAsTemplate();
3273 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3274 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3275 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3276 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3277
3278 if (Arg.getKind() == TemplateArgument::Template)
3279 Output = TemplateArgumentLoc(Arg,
3280 Builder.getWithLocInContext(SemaRef.Context),
3281 Loc);
3282 else
3283 Output = TemplateArgumentLoc(Arg,
3284 Builder.getWithLocInContext(SemaRef.Context),
3285 Loc, Loc);
3286
3287 break;
3288 }
3289
3290 case TemplateArgument::Expression:
3291 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3292 break;
3293
3294 case TemplateArgument::Declaration:
3295 case TemplateArgument::Integral:
3296 case TemplateArgument::Pack:
3297 case TemplateArgument::NullPtr:
3298 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3299 break;
3300 }
3301 }
3302
3303 template<typename Derived>
TransformTemplateArgument(const TemplateArgumentLoc & Input,TemplateArgumentLoc & Output)3304 bool TreeTransform<Derived>::TransformTemplateArgument(
3305 const TemplateArgumentLoc &Input,
3306 TemplateArgumentLoc &Output) {
3307 const TemplateArgument &Arg = Input.getArgument();
3308 switch (Arg.getKind()) {
3309 case TemplateArgument::Null:
3310 case TemplateArgument::Integral:
3311 case TemplateArgument::Pack:
3312 case TemplateArgument::Declaration:
3313 case TemplateArgument::NullPtr:
3314 llvm_unreachable("Unexpected TemplateArgument");
3315
3316 case TemplateArgument::Type: {
3317 TypeSourceInfo *DI = Input.getTypeSourceInfo();
3318 if (!DI)
3319 DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3320
3321 DI = getDerived().TransformType(DI);
3322 if (!DI) return true;
3323
3324 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3325 return false;
3326 }
3327
3328 case TemplateArgument::Template: {
3329 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3330 if (QualifierLoc) {
3331 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3332 if (!QualifierLoc)
3333 return true;
3334 }
3335
3336 CXXScopeSpec SS;
3337 SS.Adopt(QualifierLoc);
3338 TemplateName Template
3339 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3340 Input.getTemplateNameLoc());
3341 if (Template.isNull())
3342 return true;
3343
3344 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3345 Input.getTemplateNameLoc());
3346 return false;
3347 }
3348
3349 case TemplateArgument::TemplateExpansion:
3350 llvm_unreachable("Caller should expand pack expansions");
3351
3352 case TemplateArgument::Expression: {
3353 // Template argument expressions are constant expressions.
3354 EnterExpressionEvaluationContext Unevaluated(getSema(),
3355 Sema::ConstantEvaluated);
3356
3357 Expr *InputExpr = Input.getSourceExpression();
3358 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3359
3360 ExprResult E = getDerived().TransformExpr(InputExpr);
3361 E = SemaRef.ActOnConstantExpression(E);
3362 if (E.isInvalid()) return true;
3363 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3364 return false;
3365 }
3366 }
3367
3368 // Work around bogus GCC warning
3369 return true;
3370 }
3371
3372 /// \brief Iterator adaptor that invents template argument location information
3373 /// for each of the template arguments in its underlying iterator.
3374 template<typename Derived, typename InputIterator>
3375 class TemplateArgumentLocInventIterator {
3376 TreeTransform<Derived> &Self;
3377 InputIterator Iter;
3378
3379 public:
3380 typedef TemplateArgumentLoc value_type;
3381 typedef TemplateArgumentLoc reference;
3382 typedef typename std::iterator_traits<InputIterator>::difference_type
3383 difference_type;
3384 typedef std::input_iterator_tag iterator_category;
3385
3386 class pointer {
3387 TemplateArgumentLoc Arg;
3388
3389 public:
pointer(TemplateArgumentLoc Arg)3390 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3391
3392 const TemplateArgumentLoc *operator->() const { return &Arg; }
3393 };
3394
TemplateArgumentLocInventIterator()3395 TemplateArgumentLocInventIterator() { }
3396
TemplateArgumentLocInventIterator(TreeTransform<Derived> & Self,InputIterator Iter)3397 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3398 InputIterator Iter)
3399 : Self(Self), Iter(Iter) { }
3400
3401 TemplateArgumentLocInventIterator &operator++() {
3402 ++Iter;
3403 return *this;
3404 }
3405
3406 TemplateArgumentLocInventIterator operator++(int) {
3407 TemplateArgumentLocInventIterator Old(*this);
3408 ++(*this);
3409 return Old;
3410 }
3411
3412 reference operator*() const {
3413 TemplateArgumentLoc Result;
3414 Self.InventTemplateArgumentLoc(*Iter, Result);
3415 return Result;
3416 }
3417
3418 pointer operator->() const { return pointer(**this); }
3419
3420 friend bool operator==(const TemplateArgumentLocInventIterator &X,
3421 const TemplateArgumentLocInventIterator &Y) {
3422 return X.Iter == Y.Iter;
3423 }
3424
3425 friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3426 const TemplateArgumentLocInventIterator &Y) {
3427 return X.Iter != Y.Iter;
3428 }
3429 };
3430
3431 template<typename Derived>
3432 template<typename InputIterator>
TransformTemplateArguments(InputIterator First,InputIterator Last,TemplateArgumentListInfo & Outputs)3433 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
3434 InputIterator Last,
3435 TemplateArgumentListInfo &Outputs) {
3436 for (; First != Last; ++First) {
3437 TemplateArgumentLoc Out;
3438 TemplateArgumentLoc In = *First;
3439
3440 if (In.getArgument().getKind() == TemplateArgument::Pack) {
3441 // Unpack argument packs, which we translate them into separate
3442 // arguments.
3443 // FIXME: We could do much better if we could guarantee that the
3444 // TemplateArgumentLocInfo for the pack expansion would be usable for
3445 // all of the template arguments in the argument pack.
3446 typedef TemplateArgumentLocInventIterator<Derived,
3447 TemplateArgument::pack_iterator>
3448 PackLocIterator;
3449 if (TransformTemplateArguments(PackLocIterator(*this,
3450 In.getArgument().pack_begin()),
3451 PackLocIterator(*this,
3452 In.getArgument().pack_end()),
3453 Outputs))
3454 return true;
3455
3456 continue;
3457 }
3458
3459 if (In.getArgument().isPackExpansion()) {
3460 // We have a pack expansion, for which we will be substituting into
3461 // the pattern.
3462 SourceLocation Ellipsis;
3463 Optional<unsigned> OrigNumExpansions;
3464 TemplateArgumentLoc Pattern
3465 = getSema().getTemplateArgumentPackExpansionPattern(
3466 In, Ellipsis, OrigNumExpansions);
3467
3468 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3469 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3470 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3471
3472 // Determine whether the set of unexpanded parameter packs can and should
3473 // be expanded.
3474 bool Expand = true;
3475 bool RetainExpansion = false;
3476 Optional<unsigned> NumExpansions = OrigNumExpansions;
3477 if (getDerived().TryExpandParameterPacks(Ellipsis,
3478 Pattern.getSourceRange(),
3479 Unexpanded,
3480 Expand,
3481 RetainExpansion,
3482 NumExpansions))
3483 return true;
3484
3485 if (!Expand) {
3486 // The transform has determined that we should perform a simple
3487 // transformation on the pack expansion, producing another pack
3488 // expansion.
3489 TemplateArgumentLoc OutPattern;
3490 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3491 if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
3492 return true;
3493
3494 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3495 NumExpansions);
3496 if (Out.getArgument().isNull())
3497 return true;
3498
3499 Outputs.addArgument(Out);
3500 continue;
3501 }
3502
3503 // The transform has determined that we should perform an elementwise
3504 // expansion of the pattern. Do so.
3505 for (unsigned I = 0; I != *NumExpansions; ++I) {
3506 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3507
3508 if (getDerived().TransformTemplateArgument(Pattern, Out))
3509 return true;
3510
3511 if (Out.getArgument().containsUnexpandedParameterPack()) {
3512 Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3513 OrigNumExpansions);
3514 if (Out.getArgument().isNull())
3515 return true;
3516 }
3517
3518 Outputs.addArgument(Out);
3519 }
3520
3521 // If we're supposed to retain a pack expansion, do so by temporarily
3522 // forgetting the partially-substituted parameter pack.
3523 if (RetainExpansion) {
3524 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3525
3526 if (getDerived().TransformTemplateArgument(Pattern, Out))
3527 return true;
3528
3529 Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3530 OrigNumExpansions);
3531 if (Out.getArgument().isNull())
3532 return true;
3533
3534 Outputs.addArgument(Out);
3535 }
3536
3537 continue;
3538 }
3539
3540 // The simple case:
3541 if (getDerived().TransformTemplateArgument(In, Out))
3542 return true;
3543
3544 Outputs.addArgument(Out);
3545 }
3546
3547 return false;
3548
3549 }
3550
3551 //===----------------------------------------------------------------------===//
3552 // Type transformation
3553 //===----------------------------------------------------------------------===//
3554
3555 template<typename Derived>
TransformType(QualType T)3556 QualType TreeTransform<Derived>::TransformType(QualType T) {
3557 if (getDerived().AlreadyTransformed(T))
3558 return T;
3559
3560 // Temporary workaround. All of these transformations should
3561 // eventually turn into transformations on TypeLocs.
3562 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3563 getDerived().getBaseLocation());
3564
3565 TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3566
3567 if (!NewDI)
3568 return QualType();
3569
3570 return NewDI->getType();
3571 }
3572
3573 template<typename Derived>
TransformType(TypeSourceInfo * DI)3574 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3575 // Refine the base location to the type's location.
3576 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
3577 getDerived().getBaseEntity());
3578 if (getDerived().AlreadyTransformed(DI->getType()))
3579 return DI;
3580
3581 TypeLocBuilder TLB;
3582
3583 TypeLoc TL = DI->getTypeLoc();
3584 TLB.reserve(TL.getFullDataSize());
3585
3586 QualType Result = getDerived().TransformType(TLB, TL);
3587 if (Result.isNull())
3588 return nullptr;
3589
3590 return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3591 }
3592
3593 template<typename Derived>
3594 QualType
TransformType(TypeLocBuilder & TLB,TypeLoc T)3595 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3596 switch (T.getTypeLocClass()) {
3597 #define ABSTRACT_TYPELOC(CLASS, PARENT)
3598 #define TYPELOC(CLASS, PARENT) \
3599 case TypeLoc::CLASS: \
3600 return getDerived().Transform##CLASS##Type(TLB, \
3601 T.castAs<CLASS##TypeLoc>());
3602 #include "clang/AST/TypeLocNodes.def"
3603 }
3604
3605 llvm_unreachable("unhandled type loc!");
3606 }
3607
3608 /// FIXME: By default, this routine adds type qualifiers only to types
3609 /// that can have qualifiers, and silently suppresses those qualifiers
3610 /// that are not permitted (e.g., qualifiers on reference or function
3611 /// types). This is the right thing for template instantiation, but
3612 /// probably not for other clients.
3613 template<typename Derived>
3614 QualType
TransformQualifiedType(TypeLocBuilder & TLB,QualifiedTypeLoc T)3615 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
3616 QualifiedTypeLoc T) {
3617 Qualifiers Quals = T.getType().getLocalQualifiers();
3618
3619 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3620 if (Result.isNull())
3621 return QualType();
3622
3623 // Silently suppress qualifiers if the result type can't be qualified.
3624 // FIXME: this is the right thing for template instantiation, but
3625 // probably not for other clients.
3626 if (Result->isFunctionType() || Result->isReferenceType())
3627 return Result;
3628
3629 // Suppress Objective-C lifetime qualifiers if they don't make sense for the
3630 // resulting type.
3631 if (Quals.hasObjCLifetime()) {
3632 if (!Result->isObjCLifetimeType() && !Result->isDependentType())
3633 Quals.removeObjCLifetime();
3634 else if (Result.getObjCLifetime()) {
3635 // Objective-C ARC:
3636 // A lifetime qualifier applied to a substituted template parameter
3637 // overrides the lifetime qualifier from the template argument.
3638 const AutoType *AutoTy;
3639 if (const SubstTemplateTypeParmType *SubstTypeParam
3640 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
3641 QualType Replacement = SubstTypeParam->getReplacementType();
3642 Qualifiers Qs = Replacement.getQualifiers();
3643 Qs.removeObjCLifetime();
3644 Replacement
3645 = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
3646 Qs);
3647 Result = SemaRef.Context.getSubstTemplateTypeParmType(
3648 SubstTypeParam->getReplacedParameter(),
3649 Replacement);
3650 TLB.TypeWasModifiedSafely(Result);
3651 } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
3652 // 'auto' types behave the same way as template parameters.
3653 QualType Deduced = AutoTy->getDeducedType();
3654 Qualifiers Qs = Deduced.getQualifiers();
3655 Qs.removeObjCLifetime();
3656 Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
3657 Qs);
3658 Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto(),
3659 AutoTy->isDependentType());
3660 TLB.TypeWasModifiedSafely(Result);
3661 } else {
3662 // Otherwise, complain about the addition of a qualifier to an
3663 // already-qualified type.
3664 SourceRange R = T.getUnqualifiedLoc().getSourceRange();
3665 SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
3666 << Result << R;
3667
3668 Quals.removeObjCLifetime();
3669 }
3670 }
3671 }
3672 if (!Quals.empty()) {
3673 Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
3674 // BuildQualifiedType might not add qualifiers if they are invalid.
3675 if (Result.hasLocalQualifiers())
3676 TLB.push<QualifiedTypeLoc>(Result);
3677 // No location information to preserve.
3678 }
3679
3680 return Result;
3681 }
3682
3683 template<typename Derived>
3684 TypeLoc
TransformTypeInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3685 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
3686 QualType ObjectType,
3687 NamedDecl *UnqualLookup,
3688 CXXScopeSpec &SS) {
3689 if (getDerived().AlreadyTransformed(TL.getType()))
3690 return TL;
3691
3692 TypeSourceInfo *TSI =
3693 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
3694 if (TSI)
3695 return TSI->getTypeLoc();
3696 return TypeLoc();
3697 }
3698
3699 template<typename Derived>
3700 TypeSourceInfo *
TransformTypeInObjectScope(TypeSourceInfo * TSInfo,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3701 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3702 QualType ObjectType,
3703 NamedDecl *UnqualLookup,
3704 CXXScopeSpec &SS) {
3705 if (getDerived().AlreadyTransformed(TSInfo->getType()))
3706 return TSInfo;
3707
3708 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
3709 UnqualLookup, SS);
3710 }
3711
3712 template <typename Derived>
TransformTSIInObjectScope(TypeLoc TL,QualType ObjectType,NamedDecl * UnqualLookup,CXXScopeSpec & SS)3713 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
3714 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
3715 CXXScopeSpec &SS) {
3716 QualType T = TL.getType();
3717 assert(!getDerived().AlreadyTransformed(T));
3718
3719 TypeLocBuilder TLB;
3720 QualType Result;
3721
3722 if (isa<TemplateSpecializationType>(T)) {
3723 TemplateSpecializationTypeLoc SpecTL =
3724 TL.castAs<TemplateSpecializationTypeLoc>();
3725
3726 TemplateName Template
3727 = getDerived().TransformTemplateName(SS,
3728 SpecTL.getTypePtr()->getTemplateName(),
3729 SpecTL.getTemplateNameLoc(),
3730 ObjectType, UnqualLookup);
3731 if (Template.isNull())
3732 return nullptr;
3733
3734 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3735 Template);
3736 } else if (isa<DependentTemplateSpecializationType>(T)) {
3737 DependentTemplateSpecializationTypeLoc SpecTL =
3738 TL.castAs<DependentTemplateSpecializationTypeLoc>();
3739
3740 TemplateName Template
3741 = getDerived().RebuildTemplateName(SS,
3742 *SpecTL.getTypePtr()->getIdentifier(),
3743 SpecTL.getTemplateNameLoc(),
3744 ObjectType, UnqualLookup);
3745 if (Template.isNull())
3746 return nullptr;
3747
3748 Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3749 SpecTL,
3750 Template,
3751 SS);
3752 } else {
3753 // Nothing special needs to be done for these.
3754 Result = getDerived().TransformType(TLB, TL);
3755 }
3756
3757 if (Result.isNull())
3758 return nullptr;
3759
3760 return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3761 }
3762
3763 template <class TyLoc> static inline
TransformTypeSpecType(TypeLocBuilder & TLB,TyLoc T)3764 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3765 TyLoc NewT = TLB.push<TyLoc>(T.getType());
3766 NewT.setNameLoc(T.getNameLoc());
3767 return T.getType();
3768 }
3769
3770 template<typename Derived>
TransformBuiltinType(TypeLocBuilder & TLB,BuiltinTypeLoc T)3771 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
3772 BuiltinTypeLoc T) {
3773 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3774 NewT.setBuiltinLoc(T.getBuiltinLoc());
3775 if (T.needsExtraLocalData())
3776 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3777 return T.getType();
3778 }
3779
3780 template<typename Derived>
TransformComplexType(TypeLocBuilder & TLB,ComplexTypeLoc T)3781 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
3782 ComplexTypeLoc T) {
3783 // FIXME: recurse?
3784 return TransformTypeSpecType(TLB, T);
3785 }
3786
3787 template <typename Derived>
TransformAdjustedType(TypeLocBuilder & TLB,AdjustedTypeLoc TL)3788 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
3789 AdjustedTypeLoc TL) {
3790 // Adjustments applied during transformation are handled elsewhere.
3791 return getDerived().TransformType(TLB, TL.getOriginalLoc());
3792 }
3793
3794 template<typename Derived>
TransformDecayedType(TypeLocBuilder & TLB,DecayedTypeLoc TL)3795 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
3796 DecayedTypeLoc TL) {
3797 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
3798 if (OriginalType.isNull())
3799 return QualType();
3800
3801 QualType Result = TL.getType();
3802 if (getDerived().AlwaysRebuild() ||
3803 OriginalType != TL.getOriginalLoc().getType())
3804 Result = SemaRef.Context.getDecayedType(OriginalType);
3805 TLB.push<DecayedTypeLoc>(Result);
3806 // Nothing to set for DecayedTypeLoc.
3807 return Result;
3808 }
3809
3810 template<typename Derived>
TransformPointerType(TypeLocBuilder & TLB,PointerTypeLoc TL)3811 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
3812 PointerTypeLoc TL) {
3813 QualType PointeeType
3814 = getDerived().TransformType(TLB, TL.getPointeeLoc());
3815 if (PointeeType.isNull())
3816 return QualType();
3817
3818 QualType Result = TL.getType();
3819 if (PointeeType->getAs<ObjCObjectType>()) {
3820 // A dependent pointer type 'T *' has is being transformed such
3821 // that an Objective-C class type is being replaced for 'T'. The
3822 // resulting pointer type is an ObjCObjectPointerType, not a
3823 // PointerType.
3824 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3825
3826 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3827 NewT.setStarLoc(TL.getStarLoc());
3828 return Result;
3829 }
3830
3831 if (getDerived().AlwaysRebuild() ||
3832 PointeeType != TL.getPointeeLoc().getType()) {
3833 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
3834 if (Result.isNull())
3835 return QualType();
3836 }
3837
3838 // Objective-C ARC can add lifetime qualifiers to the type that we're
3839 // pointing to.
3840 TLB.TypeWasModifiedSafely(Result->getPointeeType());
3841
3842 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
3843 NewT.setSigilLoc(TL.getSigilLoc());
3844 return Result;
3845 }
3846
3847 template<typename Derived>
3848 QualType
TransformBlockPointerType(TypeLocBuilder & TLB,BlockPointerTypeLoc TL)3849 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
3850 BlockPointerTypeLoc TL) {
3851 QualType PointeeType
3852 = getDerived().TransformType(TLB, TL.getPointeeLoc());
3853 if (PointeeType.isNull())
3854 return QualType();
3855
3856 QualType Result = TL.getType();
3857 if (getDerived().AlwaysRebuild() ||
3858 PointeeType != TL.getPointeeLoc().getType()) {
3859 Result = getDerived().RebuildBlockPointerType(PointeeType,
3860 TL.getSigilLoc());
3861 if (Result.isNull())
3862 return QualType();
3863 }
3864
3865 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
3866 NewT.setSigilLoc(TL.getSigilLoc());
3867 return Result;
3868 }
3869
3870 /// Transforms a reference type. Note that somewhat paradoxically we
3871 /// don't care whether the type itself is an l-value type or an r-value
3872 /// type; we only care if the type was *written* as an l-value type
3873 /// or an r-value type.
3874 template<typename Derived>
3875 QualType
TransformReferenceType(TypeLocBuilder & TLB,ReferenceTypeLoc TL)3876 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
3877 ReferenceTypeLoc TL) {
3878 const ReferenceType *T = TL.getTypePtr();
3879
3880 // Note that this works with the pointee-as-written.
3881 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3882 if (PointeeType.isNull())
3883 return QualType();
3884
3885 QualType Result = TL.getType();
3886 if (getDerived().AlwaysRebuild() ||
3887 PointeeType != T->getPointeeTypeAsWritten()) {
3888 Result = getDerived().RebuildReferenceType(PointeeType,
3889 T->isSpelledAsLValue(),
3890 TL.getSigilLoc());
3891 if (Result.isNull())
3892 return QualType();
3893 }
3894
3895 // Objective-C ARC can add lifetime qualifiers to the type that we're
3896 // referring to.
3897 TLB.TypeWasModifiedSafely(
3898 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
3899
3900 // r-value references can be rebuilt as l-value references.
3901 ReferenceTypeLoc NewTL;
3902 if (isa<LValueReferenceType>(Result))
3903 NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
3904 else
3905 NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
3906 NewTL.setSigilLoc(TL.getSigilLoc());
3907
3908 return Result;
3909 }
3910
3911 template<typename Derived>
3912 QualType
TransformLValueReferenceType(TypeLocBuilder & TLB,LValueReferenceTypeLoc TL)3913 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
3914 LValueReferenceTypeLoc TL) {
3915 return TransformReferenceType(TLB, TL);
3916 }
3917
3918 template<typename Derived>
3919 QualType
TransformRValueReferenceType(TypeLocBuilder & TLB,RValueReferenceTypeLoc TL)3920 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
3921 RValueReferenceTypeLoc TL) {
3922 return TransformReferenceType(TLB, TL);
3923 }
3924
3925 template<typename Derived>
3926 QualType
TransformMemberPointerType(TypeLocBuilder & TLB,MemberPointerTypeLoc TL)3927 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
3928 MemberPointerTypeLoc TL) {
3929 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3930 if (PointeeType.isNull())
3931 return QualType();
3932
3933 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
3934 TypeSourceInfo *NewClsTInfo = nullptr;
3935 if (OldClsTInfo) {
3936 NewClsTInfo = getDerived().TransformType(OldClsTInfo);
3937 if (!NewClsTInfo)
3938 return QualType();
3939 }
3940
3941 const MemberPointerType *T = TL.getTypePtr();
3942 QualType OldClsType = QualType(T->getClass(), 0);
3943 QualType NewClsType;
3944 if (NewClsTInfo)
3945 NewClsType = NewClsTInfo->getType();
3946 else {
3947 NewClsType = getDerived().TransformType(OldClsType);
3948 if (NewClsType.isNull())
3949 return QualType();
3950 }
3951
3952 QualType Result = TL.getType();
3953 if (getDerived().AlwaysRebuild() ||
3954 PointeeType != T->getPointeeType() ||
3955 NewClsType != OldClsType) {
3956 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
3957 TL.getStarLoc());
3958 if (Result.isNull())
3959 return QualType();
3960 }
3961
3962 // If we had to adjust the pointee type when building a member pointer, make
3963 // sure to push TypeLoc info for it.
3964 const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
3965 if (MPT && PointeeType != MPT->getPointeeType()) {
3966 assert(isa<AdjustedType>(MPT->getPointeeType()));
3967 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
3968 }
3969
3970 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
3971 NewTL.setSigilLoc(TL.getSigilLoc());
3972 NewTL.setClassTInfo(NewClsTInfo);
3973
3974 return Result;
3975 }
3976
3977 template<typename Derived>
3978 QualType
TransformConstantArrayType(TypeLocBuilder & TLB,ConstantArrayTypeLoc TL)3979 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
3980 ConstantArrayTypeLoc TL) {
3981 const ConstantArrayType *T = TL.getTypePtr();
3982 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3983 if (ElementType.isNull())
3984 return QualType();
3985
3986 QualType Result = TL.getType();
3987 if (getDerived().AlwaysRebuild() ||
3988 ElementType != T->getElementType()) {
3989 Result = getDerived().RebuildConstantArrayType(ElementType,
3990 T->getSizeModifier(),
3991 T->getSize(),
3992 T->getIndexTypeCVRQualifiers(),
3993 TL.getBracketsRange());
3994 if (Result.isNull())
3995 return QualType();
3996 }
3997
3998 // We might have either a ConstantArrayType or a VariableArrayType now:
3999 // a ConstantArrayType is allowed to have an element type which is a
4000 // VariableArrayType if the type is dependent. Fortunately, all array
4001 // types have the same location layout.
4002 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4003 NewTL.setLBracketLoc(TL.getLBracketLoc());
4004 NewTL.setRBracketLoc(TL.getRBracketLoc());
4005
4006 Expr *Size = TL.getSizeExpr();
4007 if (Size) {
4008 EnterExpressionEvaluationContext Unevaluated(SemaRef,
4009 Sema::ConstantEvaluated);
4010 Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4011 Size = SemaRef.ActOnConstantExpression(Size).get();
4012 }
4013 NewTL.setSizeExpr(Size);
4014
4015 return Result;
4016 }
4017
4018 template<typename Derived>
TransformIncompleteArrayType(TypeLocBuilder & TLB,IncompleteArrayTypeLoc TL)4019 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4020 TypeLocBuilder &TLB,
4021 IncompleteArrayTypeLoc TL) {
4022 const IncompleteArrayType *T = TL.getTypePtr();
4023 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4024 if (ElementType.isNull())
4025 return QualType();
4026
4027 QualType Result = TL.getType();
4028 if (getDerived().AlwaysRebuild() ||
4029 ElementType != T->getElementType()) {
4030 Result = getDerived().RebuildIncompleteArrayType(ElementType,
4031 T->getSizeModifier(),
4032 T->getIndexTypeCVRQualifiers(),
4033 TL.getBracketsRange());
4034 if (Result.isNull())
4035 return QualType();
4036 }
4037
4038 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4039 NewTL.setLBracketLoc(TL.getLBracketLoc());
4040 NewTL.setRBracketLoc(TL.getRBracketLoc());
4041 NewTL.setSizeExpr(nullptr);
4042
4043 return Result;
4044 }
4045
4046 template<typename Derived>
4047 QualType
TransformVariableArrayType(TypeLocBuilder & TLB,VariableArrayTypeLoc TL)4048 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4049 VariableArrayTypeLoc TL) {
4050 const VariableArrayType *T = TL.getTypePtr();
4051 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4052 if (ElementType.isNull())
4053 return QualType();
4054
4055 ExprResult SizeResult
4056 = getDerived().TransformExpr(T->getSizeExpr());
4057 if (SizeResult.isInvalid())
4058 return QualType();
4059
4060 Expr *Size = SizeResult.get();
4061
4062 QualType Result = TL.getType();
4063 if (getDerived().AlwaysRebuild() ||
4064 ElementType != T->getElementType() ||
4065 Size != T->getSizeExpr()) {
4066 Result = getDerived().RebuildVariableArrayType(ElementType,
4067 T->getSizeModifier(),
4068 Size,
4069 T->getIndexTypeCVRQualifiers(),
4070 TL.getBracketsRange());
4071 if (Result.isNull())
4072 return QualType();
4073 }
4074
4075 // We might have constant size array now, but fortunately it has the same
4076 // location layout.
4077 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4078 NewTL.setLBracketLoc(TL.getLBracketLoc());
4079 NewTL.setRBracketLoc(TL.getRBracketLoc());
4080 NewTL.setSizeExpr(Size);
4081
4082 return Result;
4083 }
4084
4085 template<typename Derived>
4086 QualType
TransformDependentSizedArrayType(TypeLocBuilder & TLB,DependentSizedArrayTypeLoc TL)4087 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4088 DependentSizedArrayTypeLoc TL) {
4089 const DependentSizedArrayType *T = TL.getTypePtr();
4090 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4091 if (ElementType.isNull())
4092 return QualType();
4093
4094 // Array bounds are constant expressions.
4095 EnterExpressionEvaluationContext Unevaluated(SemaRef,
4096 Sema::ConstantEvaluated);
4097
4098 // Prefer the expression from the TypeLoc; the other may have been uniqued.
4099 Expr *origSize = TL.getSizeExpr();
4100 if (!origSize) origSize = T->getSizeExpr();
4101
4102 ExprResult sizeResult
4103 = getDerived().TransformExpr(origSize);
4104 sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4105 if (sizeResult.isInvalid())
4106 return QualType();
4107
4108 Expr *size = sizeResult.get();
4109
4110 QualType Result = TL.getType();
4111 if (getDerived().AlwaysRebuild() ||
4112 ElementType != T->getElementType() ||
4113 size != origSize) {
4114 Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4115 T->getSizeModifier(),
4116 size,
4117 T->getIndexTypeCVRQualifiers(),
4118 TL.getBracketsRange());
4119 if (Result.isNull())
4120 return QualType();
4121 }
4122
4123 // We might have any sort of array type now, but fortunately they
4124 // all have the same location layout.
4125 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4126 NewTL.setLBracketLoc(TL.getLBracketLoc());
4127 NewTL.setRBracketLoc(TL.getRBracketLoc());
4128 NewTL.setSizeExpr(size);
4129
4130 return Result;
4131 }
4132
4133 template<typename Derived>
TransformDependentSizedExtVectorType(TypeLocBuilder & TLB,DependentSizedExtVectorTypeLoc TL)4134 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4135 TypeLocBuilder &TLB,
4136 DependentSizedExtVectorTypeLoc TL) {
4137 const DependentSizedExtVectorType *T = TL.getTypePtr();
4138
4139 // FIXME: ext vector locs should be nested
4140 QualType ElementType = getDerived().TransformType(T->getElementType());
4141 if (ElementType.isNull())
4142 return QualType();
4143
4144 // Vector sizes are constant expressions.
4145 EnterExpressionEvaluationContext Unevaluated(SemaRef,
4146 Sema::ConstantEvaluated);
4147
4148 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4149 Size = SemaRef.ActOnConstantExpression(Size);
4150 if (Size.isInvalid())
4151 return QualType();
4152
4153 QualType Result = TL.getType();
4154 if (getDerived().AlwaysRebuild() ||
4155 ElementType != T->getElementType() ||
4156 Size.get() != T->getSizeExpr()) {
4157 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4158 Size.get(),
4159 T->getAttributeLoc());
4160 if (Result.isNull())
4161 return QualType();
4162 }
4163
4164 // Result might be dependent or not.
4165 if (isa<DependentSizedExtVectorType>(Result)) {
4166 DependentSizedExtVectorTypeLoc NewTL
4167 = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4168 NewTL.setNameLoc(TL.getNameLoc());
4169 } else {
4170 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4171 NewTL.setNameLoc(TL.getNameLoc());
4172 }
4173
4174 return Result;
4175 }
4176
4177 template<typename Derived>
TransformVectorType(TypeLocBuilder & TLB,VectorTypeLoc TL)4178 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4179 VectorTypeLoc TL) {
4180 const VectorType *T = TL.getTypePtr();
4181 QualType ElementType = getDerived().TransformType(T->getElementType());
4182 if (ElementType.isNull())
4183 return QualType();
4184
4185 QualType Result = TL.getType();
4186 if (getDerived().AlwaysRebuild() ||
4187 ElementType != T->getElementType()) {
4188 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4189 T->getVectorKind());
4190 if (Result.isNull())
4191 return QualType();
4192 }
4193
4194 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4195 NewTL.setNameLoc(TL.getNameLoc());
4196
4197 return Result;
4198 }
4199
4200 template<typename Derived>
TransformExtVectorType(TypeLocBuilder & TLB,ExtVectorTypeLoc TL)4201 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4202 ExtVectorTypeLoc TL) {
4203 const VectorType *T = TL.getTypePtr();
4204 QualType ElementType = getDerived().TransformType(T->getElementType());
4205 if (ElementType.isNull())
4206 return QualType();
4207
4208 QualType Result = TL.getType();
4209 if (getDerived().AlwaysRebuild() ||
4210 ElementType != T->getElementType()) {
4211 Result = getDerived().RebuildExtVectorType(ElementType,
4212 T->getNumElements(),
4213 /*FIXME*/ SourceLocation());
4214 if (Result.isNull())
4215 return QualType();
4216 }
4217
4218 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4219 NewTL.setNameLoc(TL.getNameLoc());
4220
4221 return Result;
4222 }
4223
4224 template <typename Derived>
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,Optional<unsigned> NumExpansions,bool ExpectParameterPack)4225 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4226 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4227 bool ExpectParameterPack) {
4228 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4229 TypeSourceInfo *NewDI = nullptr;
4230
4231 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4232 // If we're substituting into a pack expansion type and we know the
4233 // length we want to expand to, just substitute for the pattern.
4234 TypeLoc OldTL = OldDI->getTypeLoc();
4235 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4236
4237 TypeLocBuilder TLB;
4238 TypeLoc NewTL = OldDI->getTypeLoc();
4239 TLB.reserve(NewTL.getFullDataSize());
4240
4241 QualType Result = getDerived().TransformType(TLB,
4242 OldExpansionTL.getPatternLoc());
4243 if (Result.isNull())
4244 return nullptr;
4245
4246 Result = RebuildPackExpansionType(Result,
4247 OldExpansionTL.getPatternLoc().getSourceRange(),
4248 OldExpansionTL.getEllipsisLoc(),
4249 NumExpansions);
4250 if (Result.isNull())
4251 return nullptr;
4252
4253 PackExpansionTypeLoc NewExpansionTL
4254 = TLB.push<PackExpansionTypeLoc>(Result);
4255 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4256 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4257 } else
4258 NewDI = getDerived().TransformType(OldDI);
4259 if (!NewDI)
4260 return nullptr;
4261
4262 if (NewDI == OldDI && indexAdjustment == 0)
4263 return OldParm;
4264
4265 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4266 OldParm->getDeclContext(),
4267 OldParm->getInnerLocStart(),
4268 OldParm->getLocation(),
4269 OldParm->getIdentifier(),
4270 NewDI->getType(),
4271 NewDI,
4272 OldParm->getStorageClass(),
4273 /* DefArg */ nullptr);
4274 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4275 OldParm->getFunctionScopeIndex() + indexAdjustment);
4276 return newParm;
4277 }
4278
4279 template<typename Derived>
4280 bool TreeTransform<Derived>::
TransformFunctionTypeParams(SourceLocation Loc,ParmVarDecl ** Params,unsigned NumParams,const QualType * ParamTypes,SmallVectorImpl<QualType> & OutParamTypes,SmallVectorImpl<ParmVarDecl * > * PVars)4281 TransformFunctionTypeParams(SourceLocation Loc,
4282 ParmVarDecl **Params, unsigned NumParams,
4283 const QualType *ParamTypes,
4284 SmallVectorImpl<QualType> &OutParamTypes,
4285 SmallVectorImpl<ParmVarDecl*> *PVars) {
4286 int indexAdjustment = 0;
4287
4288 for (unsigned i = 0; i != NumParams; ++i) {
4289 if (ParmVarDecl *OldParm = Params[i]) {
4290 assert(OldParm->getFunctionScopeIndex() == i);
4291
4292 Optional<unsigned> NumExpansions;
4293 ParmVarDecl *NewParm = nullptr;
4294 if (OldParm->isParameterPack()) {
4295 // We have a function parameter pack that may need to be expanded.
4296 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4297
4298 // Find the parameter packs that could be expanded.
4299 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4300 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4301 TypeLoc Pattern = ExpansionTL.getPatternLoc();
4302 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4303 assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4304
4305 // Determine whether we should expand the parameter packs.
4306 bool ShouldExpand = false;
4307 bool RetainExpansion = false;
4308 Optional<unsigned> OrigNumExpansions =
4309 ExpansionTL.getTypePtr()->getNumExpansions();
4310 NumExpansions = OrigNumExpansions;
4311 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4312 Pattern.getSourceRange(),
4313 Unexpanded,
4314 ShouldExpand,
4315 RetainExpansion,
4316 NumExpansions)) {
4317 return true;
4318 }
4319
4320 if (ShouldExpand) {
4321 // Expand the function parameter pack into multiple, separate
4322 // parameters.
4323 getDerived().ExpandingFunctionParameterPack(OldParm);
4324 for (unsigned I = 0; I != *NumExpansions; ++I) {
4325 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4326 ParmVarDecl *NewParm
4327 = getDerived().TransformFunctionTypeParam(OldParm,
4328 indexAdjustment++,
4329 OrigNumExpansions,
4330 /*ExpectParameterPack=*/false);
4331 if (!NewParm)
4332 return true;
4333
4334 OutParamTypes.push_back(NewParm->getType());
4335 if (PVars)
4336 PVars->push_back(NewParm);
4337 }
4338
4339 // If we're supposed to retain a pack expansion, do so by temporarily
4340 // forgetting the partially-substituted parameter pack.
4341 if (RetainExpansion) {
4342 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4343 ParmVarDecl *NewParm
4344 = getDerived().TransformFunctionTypeParam(OldParm,
4345 indexAdjustment++,
4346 OrigNumExpansions,
4347 /*ExpectParameterPack=*/false);
4348 if (!NewParm)
4349 return true;
4350
4351 OutParamTypes.push_back(NewParm->getType());
4352 if (PVars)
4353 PVars->push_back(NewParm);
4354 }
4355
4356 // The next parameter should have the same adjustment as the
4357 // last thing we pushed, but we post-incremented indexAdjustment
4358 // on every push. Also, if we push nothing, the adjustment should
4359 // go down by one.
4360 indexAdjustment--;
4361
4362 // We're done with the pack expansion.
4363 continue;
4364 }
4365
4366 // We'll substitute the parameter now without expanding the pack
4367 // expansion.
4368 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4369 NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4370 indexAdjustment,
4371 NumExpansions,
4372 /*ExpectParameterPack=*/true);
4373 } else {
4374 NewParm = getDerived().TransformFunctionTypeParam(
4375 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4376 }
4377
4378 if (!NewParm)
4379 return true;
4380
4381 OutParamTypes.push_back(NewParm->getType());
4382 if (PVars)
4383 PVars->push_back(NewParm);
4384 continue;
4385 }
4386
4387 // Deal with the possibility that we don't have a parameter
4388 // declaration for this parameter.
4389 QualType OldType = ParamTypes[i];
4390 bool IsPackExpansion = false;
4391 Optional<unsigned> NumExpansions;
4392 QualType NewType;
4393 if (const PackExpansionType *Expansion
4394 = dyn_cast<PackExpansionType>(OldType)) {
4395 // We have a function parameter pack that may need to be expanded.
4396 QualType Pattern = Expansion->getPattern();
4397 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4398 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4399
4400 // Determine whether we should expand the parameter packs.
4401 bool ShouldExpand = false;
4402 bool RetainExpansion = false;
4403 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4404 Unexpanded,
4405 ShouldExpand,
4406 RetainExpansion,
4407 NumExpansions)) {
4408 return true;
4409 }
4410
4411 if (ShouldExpand) {
4412 // Expand the function parameter pack into multiple, separate
4413 // parameters.
4414 for (unsigned I = 0; I != *NumExpansions; ++I) {
4415 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4416 QualType NewType = getDerived().TransformType(Pattern);
4417 if (NewType.isNull())
4418 return true;
4419
4420 OutParamTypes.push_back(NewType);
4421 if (PVars)
4422 PVars->push_back(nullptr);
4423 }
4424
4425 // We're done with the pack expansion.
4426 continue;
4427 }
4428
4429 // If we're supposed to retain a pack expansion, do so by temporarily
4430 // forgetting the partially-substituted parameter pack.
4431 if (RetainExpansion) {
4432 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4433 QualType NewType = getDerived().TransformType(Pattern);
4434 if (NewType.isNull())
4435 return true;
4436
4437 OutParamTypes.push_back(NewType);
4438 if (PVars)
4439 PVars->push_back(nullptr);
4440 }
4441
4442 // We'll substitute the parameter now without expanding the pack
4443 // expansion.
4444 OldType = Expansion->getPattern();
4445 IsPackExpansion = true;
4446 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4447 NewType = getDerived().TransformType(OldType);
4448 } else {
4449 NewType = getDerived().TransformType(OldType);
4450 }
4451
4452 if (NewType.isNull())
4453 return true;
4454
4455 if (IsPackExpansion)
4456 NewType = getSema().Context.getPackExpansionType(NewType,
4457 NumExpansions);
4458
4459 OutParamTypes.push_back(NewType);
4460 if (PVars)
4461 PVars->push_back(nullptr);
4462 }
4463
4464 #ifndef NDEBUG
4465 if (PVars) {
4466 for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4467 if (ParmVarDecl *parm = (*PVars)[i])
4468 assert(parm->getFunctionScopeIndex() == i);
4469 }
4470 #endif
4471
4472 return false;
4473 }
4474
4475 template<typename Derived>
4476 QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)4477 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4478 FunctionProtoTypeLoc TL) {
4479 return getDerived().TransformFunctionProtoType(TLB, TL, nullptr, 0);
4480 }
4481
4482 template<typename Derived>
4483 QualType
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL,CXXRecordDecl * ThisContext,unsigned ThisTypeQuals)4484 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4485 FunctionProtoTypeLoc TL,
4486 CXXRecordDecl *ThisContext,
4487 unsigned ThisTypeQuals) {
4488 // Transform the parameters and return type.
4489 //
4490 // We are required to instantiate the params and return type in source order.
4491 // When the function has a trailing return type, we instantiate the
4492 // parameters before the return type, since the return type can then refer
4493 // to the parameters themselves (via decltype, sizeof, etc.).
4494 //
4495 SmallVector<QualType, 4> ParamTypes;
4496 SmallVector<ParmVarDecl*, 4> ParamDecls;
4497 const FunctionProtoType *T = TL.getTypePtr();
4498
4499 QualType ResultType;
4500
4501 if (T->hasTrailingReturn()) {
4502 if (getDerived().TransformFunctionTypeParams(
4503 TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4504 TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4505 return QualType();
4506
4507 {
4508 // C++11 [expr.prim.general]p3:
4509 // If a declaration declares a member function or member function
4510 // template of a class X, the expression this is a prvalue of type
4511 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4512 // and the end of the function-definition, member-declarator, or
4513 // declarator.
4514 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4515
4516 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4517 if (ResultType.isNull())
4518 return QualType();
4519 }
4520 }
4521 else {
4522 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4523 if (ResultType.isNull())
4524 return QualType();
4525
4526 if (getDerived().TransformFunctionTypeParams(
4527 TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4528 TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4529 return QualType();
4530 }
4531
4532 // FIXME: Need to transform the exception-specification too.
4533
4534 QualType Result = TL.getType();
4535 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
4536 T->getNumParams() != ParamTypes.size() ||
4537 !std::equal(T->param_type_begin(), T->param_type_end(),
4538 ParamTypes.begin())) {
4539 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes,
4540 T->getExtProtoInfo());
4541 if (Result.isNull())
4542 return QualType();
4543 }
4544
4545 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
4546 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4547 NewTL.setLParenLoc(TL.getLParenLoc());
4548 NewTL.setRParenLoc(TL.getRParenLoc());
4549 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4550 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
4551 NewTL.setParam(i, ParamDecls[i]);
4552
4553 return Result;
4554 }
4555
4556 template<typename Derived>
TransformFunctionNoProtoType(TypeLocBuilder & TLB,FunctionNoProtoTypeLoc TL)4557 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
4558 TypeLocBuilder &TLB,
4559 FunctionNoProtoTypeLoc TL) {
4560 const FunctionNoProtoType *T = TL.getTypePtr();
4561 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4562 if (ResultType.isNull())
4563 return QualType();
4564
4565 QualType Result = TL.getType();
4566 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
4567 Result = getDerived().RebuildFunctionNoProtoType(ResultType);
4568
4569 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
4570 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4571 NewTL.setLParenLoc(TL.getLParenLoc());
4572 NewTL.setRParenLoc(TL.getRParenLoc());
4573 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4574
4575 return Result;
4576 }
4577
4578 template<typename Derived> QualType
TransformUnresolvedUsingType(TypeLocBuilder & TLB,UnresolvedUsingTypeLoc TL)4579 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
4580 UnresolvedUsingTypeLoc TL) {
4581 const UnresolvedUsingType *T = TL.getTypePtr();
4582 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
4583 if (!D)
4584 return QualType();
4585
4586 QualType Result = TL.getType();
4587 if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
4588 Result = getDerived().RebuildUnresolvedUsingType(D);
4589 if (Result.isNull())
4590 return QualType();
4591 }
4592
4593 // We might get an arbitrary type spec type back. We should at
4594 // least always get a type spec type, though.
4595 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
4596 NewTL.setNameLoc(TL.getNameLoc());
4597
4598 return Result;
4599 }
4600
4601 template<typename Derived>
TransformTypedefType(TypeLocBuilder & TLB,TypedefTypeLoc TL)4602 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
4603 TypedefTypeLoc TL) {
4604 const TypedefType *T = TL.getTypePtr();
4605 TypedefNameDecl *Typedef
4606 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4607 T->getDecl()));
4608 if (!Typedef)
4609 return QualType();
4610
4611 QualType Result = TL.getType();
4612 if (getDerived().AlwaysRebuild() ||
4613 Typedef != T->getDecl()) {
4614 Result = getDerived().RebuildTypedefType(Typedef);
4615 if (Result.isNull())
4616 return QualType();
4617 }
4618
4619 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
4620 NewTL.setNameLoc(TL.getNameLoc());
4621
4622 return Result;
4623 }
4624
4625 template<typename Derived>
TransformTypeOfExprType(TypeLocBuilder & TLB,TypeOfExprTypeLoc TL)4626 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
4627 TypeOfExprTypeLoc TL) {
4628 // typeof expressions are not potentially evaluated contexts
4629 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4630 Sema::ReuseLambdaContextDecl);
4631
4632 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
4633 if (E.isInvalid())
4634 return QualType();
4635
4636 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
4637 if (E.isInvalid())
4638 return QualType();
4639
4640 QualType Result = TL.getType();
4641 if (getDerived().AlwaysRebuild() ||
4642 E.get() != TL.getUnderlyingExpr()) {
4643 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
4644 if (Result.isNull())
4645 return QualType();
4646 }
4647 else E.get();
4648
4649 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
4650 NewTL.setTypeofLoc(TL.getTypeofLoc());
4651 NewTL.setLParenLoc(TL.getLParenLoc());
4652 NewTL.setRParenLoc(TL.getRParenLoc());
4653
4654 return Result;
4655 }
4656
4657 template<typename Derived>
TransformTypeOfType(TypeLocBuilder & TLB,TypeOfTypeLoc TL)4658 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
4659 TypeOfTypeLoc TL) {
4660 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
4661 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
4662 if (!New_Under_TI)
4663 return QualType();
4664
4665 QualType Result = TL.getType();
4666 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
4667 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
4668 if (Result.isNull())
4669 return QualType();
4670 }
4671
4672 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
4673 NewTL.setTypeofLoc(TL.getTypeofLoc());
4674 NewTL.setLParenLoc(TL.getLParenLoc());
4675 NewTL.setRParenLoc(TL.getRParenLoc());
4676 NewTL.setUnderlyingTInfo(New_Under_TI);
4677
4678 return Result;
4679 }
4680
4681 template<typename Derived>
TransformDecltypeType(TypeLocBuilder & TLB,DecltypeTypeLoc TL)4682 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
4683 DecltypeTypeLoc TL) {
4684 const DecltypeType *T = TL.getTypePtr();
4685
4686 // decltype expressions are not potentially evaluated contexts
4687 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4688 nullptr, /*IsDecltype=*/ true);
4689
4690 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4691 if (E.isInvalid())
4692 return QualType();
4693
4694 E = getSema().ActOnDecltypeExpression(E.get());
4695 if (E.isInvalid())
4696 return QualType();
4697
4698 QualType Result = TL.getType();
4699 if (getDerived().AlwaysRebuild() ||
4700 E.get() != T->getUnderlyingExpr()) {
4701 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4702 if (Result.isNull())
4703 return QualType();
4704 }
4705 else E.get();
4706
4707 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4708 NewTL.setNameLoc(TL.getNameLoc());
4709
4710 return Result;
4711 }
4712
4713 template<typename Derived>
TransformUnaryTransformType(TypeLocBuilder & TLB,UnaryTransformTypeLoc TL)4714 QualType TreeTransform<Derived>::TransformUnaryTransformType(
4715 TypeLocBuilder &TLB,
4716 UnaryTransformTypeLoc TL) {
4717 QualType Result = TL.getType();
4718 if (Result->isDependentType()) {
4719 const UnaryTransformType *T = TL.getTypePtr();
4720 QualType NewBase =
4721 getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
4722 Result = getDerived().RebuildUnaryTransformType(NewBase,
4723 T->getUTTKind(),
4724 TL.getKWLoc());
4725 if (Result.isNull())
4726 return QualType();
4727 }
4728
4729 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
4730 NewTL.setKWLoc(TL.getKWLoc());
4731 NewTL.setParensRange(TL.getParensRange());
4732 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
4733 return Result;
4734 }
4735
4736 template<typename Derived>
TransformAutoType(TypeLocBuilder & TLB,AutoTypeLoc TL)4737 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
4738 AutoTypeLoc TL) {
4739 const AutoType *T = TL.getTypePtr();
4740 QualType OldDeduced = T->getDeducedType();
4741 QualType NewDeduced;
4742 if (!OldDeduced.isNull()) {
4743 NewDeduced = getDerived().TransformType(OldDeduced);
4744 if (NewDeduced.isNull())
4745 return QualType();
4746 }
4747
4748 QualType Result = TL.getType();
4749 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
4750 T->isDependentType()) {
4751 Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto());
4752 if (Result.isNull())
4753 return QualType();
4754 }
4755
4756 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
4757 NewTL.setNameLoc(TL.getNameLoc());
4758
4759 return Result;
4760 }
4761
4762 template<typename Derived>
TransformRecordType(TypeLocBuilder & TLB,RecordTypeLoc TL)4763 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
4764 RecordTypeLoc TL) {
4765 const RecordType *T = TL.getTypePtr();
4766 RecordDecl *Record
4767 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4768 T->getDecl()));
4769 if (!Record)
4770 return QualType();
4771
4772 QualType Result = TL.getType();
4773 if (getDerived().AlwaysRebuild() ||
4774 Record != T->getDecl()) {
4775 Result = getDerived().RebuildRecordType(Record);
4776 if (Result.isNull())
4777 return QualType();
4778 }
4779
4780 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
4781 NewTL.setNameLoc(TL.getNameLoc());
4782
4783 return Result;
4784 }
4785
4786 template<typename Derived>
TransformEnumType(TypeLocBuilder & TLB,EnumTypeLoc TL)4787 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
4788 EnumTypeLoc TL) {
4789 const EnumType *T = TL.getTypePtr();
4790 EnumDecl *Enum
4791 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4792 T->getDecl()));
4793 if (!Enum)
4794 return QualType();
4795
4796 QualType Result = TL.getType();
4797 if (getDerived().AlwaysRebuild() ||
4798 Enum != T->getDecl()) {
4799 Result = getDerived().RebuildEnumType(Enum);
4800 if (Result.isNull())
4801 return QualType();
4802 }
4803
4804 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
4805 NewTL.setNameLoc(TL.getNameLoc());
4806
4807 return Result;
4808 }
4809
4810 template<typename Derived>
TransformInjectedClassNameType(TypeLocBuilder & TLB,InjectedClassNameTypeLoc TL)4811 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
4812 TypeLocBuilder &TLB,
4813 InjectedClassNameTypeLoc TL) {
4814 Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
4815 TL.getTypePtr()->getDecl());
4816 if (!D) return QualType();
4817
4818 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
4819 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
4820 return T;
4821 }
4822
4823 template<typename Derived>
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)4824 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
4825 TypeLocBuilder &TLB,
4826 TemplateTypeParmTypeLoc TL) {
4827 return TransformTypeSpecType(TLB, TL);
4828 }
4829
4830 template<typename Derived>
TransformSubstTemplateTypeParmType(TypeLocBuilder & TLB,SubstTemplateTypeParmTypeLoc TL)4831 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
4832 TypeLocBuilder &TLB,
4833 SubstTemplateTypeParmTypeLoc TL) {
4834 const SubstTemplateTypeParmType *T = TL.getTypePtr();
4835
4836 // Substitute into the replacement type, which itself might involve something
4837 // that needs to be transformed. This only tends to occur with default
4838 // template arguments of template template parameters.
4839 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
4840 QualType Replacement = getDerived().TransformType(T->getReplacementType());
4841 if (Replacement.isNull())
4842 return QualType();
4843
4844 // Always canonicalize the replacement type.
4845 Replacement = SemaRef.Context.getCanonicalType(Replacement);
4846 QualType Result
4847 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
4848 Replacement);
4849
4850 // Propagate type-source information.
4851 SubstTemplateTypeParmTypeLoc NewTL
4852 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
4853 NewTL.setNameLoc(TL.getNameLoc());
4854 return Result;
4855
4856 }
4857
4858 template<typename Derived>
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)4859 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
4860 TypeLocBuilder &TLB,
4861 SubstTemplateTypeParmPackTypeLoc TL) {
4862 return TransformTypeSpecType(TLB, TL);
4863 }
4864
4865 template<typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL)4866 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
4867 TypeLocBuilder &TLB,
4868 TemplateSpecializationTypeLoc TL) {
4869 const TemplateSpecializationType *T = TL.getTypePtr();
4870
4871 // The nested-name-specifier never matters in a TemplateSpecializationType,
4872 // because we can't have a dependent nested-name-specifier anyway.
4873 CXXScopeSpec SS;
4874 TemplateName Template
4875 = getDerived().TransformTemplateName(SS, T->getTemplateName(),
4876 TL.getTemplateNameLoc());
4877 if (Template.isNull())
4878 return QualType();
4879
4880 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
4881 }
4882
4883 template<typename Derived>
TransformAtomicType(TypeLocBuilder & TLB,AtomicTypeLoc TL)4884 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
4885 AtomicTypeLoc TL) {
4886 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
4887 if (ValueType.isNull())
4888 return QualType();
4889
4890 QualType Result = TL.getType();
4891 if (getDerived().AlwaysRebuild() ||
4892 ValueType != TL.getValueLoc().getType()) {
4893 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
4894 if (Result.isNull())
4895 return QualType();
4896 }
4897
4898 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
4899 NewTL.setKWLoc(TL.getKWLoc());
4900 NewTL.setLParenLoc(TL.getLParenLoc());
4901 NewTL.setRParenLoc(TL.getRParenLoc());
4902
4903 return Result;
4904 }
4905
4906 /// \brief Simple iterator that traverses the template arguments in a
4907 /// container that provides a \c getArgLoc() member function.
4908 ///
4909 /// This iterator is intended to be used with the iterator form of
4910 /// \c TreeTransform<Derived>::TransformTemplateArguments().
4911 template<typename ArgLocContainer>
4912 class TemplateArgumentLocContainerIterator {
4913 ArgLocContainer *Container;
4914 unsigned Index;
4915
4916 public:
4917 typedef TemplateArgumentLoc value_type;
4918 typedef TemplateArgumentLoc reference;
4919 typedef int difference_type;
4920 typedef std::input_iterator_tag iterator_category;
4921
4922 class pointer {
4923 TemplateArgumentLoc Arg;
4924
4925 public:
pointer(TemplateArgumentLoc Arg)4926 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4927
4928 const TemplateArgumentLoc *operator->() const {
4929 return &Arg;
4930 }
4931 };
4932
4933
TemplateArgumentLocContainerIterator()4934 TemplateArgumentLocContainerIterator() {}
4935
TemplateArgumentLocContainerIterator(ArgLocContainer & Container,unsigned Index)4936 TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
4937 unsigned Index)
4938 : Container(&Container), Index(Index) { }
4939
4940 TemplateArgumentLocContainerIterator &operator++() {
4941 ++Index;
4942 return *this;
4943 }
4944
4945 TemplateArgumentLocContainerIterator operator++(int) {
4946 TemplateArgumentLocContainerIterator Old(*this);
4947 ++(*this);
4948 return Old;
4949 }
4950
4951 TemplateArgumentLoc operator*() const {
4952 return Container->getArgLoc(Index);
4953 }
4954
4955 pointer operator->() const {
4956 return pointer(Container->getArgLoc(Index));
4957 }
4958
4959 friend bool operator==(const TemplateArgumentLocContainerIterator &X,
4960 const TemplateArgumentLocContainerIterator &Y) {
4961 return X.Container == Y.Container && X.Index == Y.Index;
4962 }
4963
4964 friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
4965 const TemplateArgumentLocContainerIterator &Y) {
4966 return !(X == Y);
4967 }
4968 };
4969
4970
4971 template <typename Derived>
TransformTemplateSpecializationType(TypeLocBuilder & TLB,TemplateSpecializationTypeLoc TL,TemplateName Template)4972 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
4973 TypeLocBuilder &TLB,
4974 TemplateSpecializationTypeLoc TL,
4975 TemplateName Template) {
4976 TemplateArgumentListInfo NewTemplateArgs;
4977 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4978 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4979 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
4980 ArgIterator;
4981 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
4982 ArgIterator(TL, TL.getNumArgs()),
4983 NewTemplateArgs))
4984 return QualType();
4985
4986 // FIXME: maybe don't rebuild if all the template arguments are the same.
4987
4988 QualType Result =
4989 getDerived().RebuildTemplateSpecializationType(Template,
4990 TL.getTemplateNameLoc(),
4991 NewTemplateArgs);
4992
4993 if (!Result.isNull()) {
4994 // Specializations of template template parameters are represented as
4995 // TemplateSpecializationTypes, and substitution of type alias templates
4996 // within a dependent context can transform them into
4997 // DependentTemplateSpecializationTypes.
4998 if (isa<DependentTemplateSpecializationType>(Result)) {
4999 DependentTemplateSpecializationTypeLoc NewTL
5000 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5001 NewTL.setElaboratedKeywordLoc(SourceLocation());
5002 NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5003 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5004 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5005 NewTL.setLAngleLoc(TL.getLAngleLoc());
5006 NewTL.setRAngleLoc(TL.getRAngleLoc());
5007 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5008 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5009 return Result;
5010 }
5011
5012 TemplateSpecializationTypeLoc NewTL
5013 = TLB.push<TemplateSpecializationTypeLoc>(Result);
5014 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5015 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5016 NewTL.setLAngleLoc(TL.getLAngleLoc());
5017 NewTL.setRAngleLoc(TL.getRAngleLoc());
5018 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5019 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5020 }
5021
5022 return Result;
5023 }
5024
5025 template <typename Derived>
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,TemplateName Template,CXXScopeSpec & SS)5026 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5027 TypeLocBuilder &TLB,
5028 DependentTemplateSpecializationTypeLoc TL,
5029 TemplateName Template,
5030 CXXScopeSpec &SS) {
5031 TemplateArgumentListInfo NewTemplateArgs;
5032 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5033 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5034 typedef TemplateArgumentLocContainerIterator<
5035 DependentTemplateSpecializationTypeLoc> ArgIterator;
5036 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5037 ArgIterator(TL, TL.getNumArgs()),
5038 NewTemplateArgs))
5039 return QualType();
5040
5041 // FIXME: maybe don't rebuild if all the template arguments are the same.
5042
5043 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5044 QualType Result
5045 = getSema().Context.getDependentTemplateSpecializationType(
5046 TL.getTypePtr()->getKeyword(),
5047 DTN->getQualifier(),
5048 DTN->getIdentifier(),
5049 NewTemplateArgs);
5050
5051 DependentTemplateSpecializationTypeLoc NewTL
5052 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5053 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5054 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5055 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5056 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5057 NewTL.setLAngleLoc(TL.getLAngleLoc());
5058 NewTL.setRAngleLoc(TL.getRAngleLoc());
5059 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5060 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5061 return Result;
5062 }
5063
5064 QualType Result
5065 = getDerived().RebuildTemplateSpecializationType(Template,
5066 TL.getTemplateNameLoc(),
5067 NewTemplateArgs);
5068
5069 if (!Result.isNull()) {
5070 /// FIXME: Wrap this in an elaborated-type-specifier?
5071 TemplateSpecializationTypeLoc NewTL
5072 = TLB.push<TemplateSpecializationTypeLoc>(Result);
5073 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5074 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5075 NewTL.setLAngleLoc(TL.getLAngleLoc());
5076 NewTL.setRAngleLoc(TL.getRAngleLoc());
5077 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5078 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5079 }
5080
5081 return Result;
5082 }
5083
5084 template<typename Derived>
5085 QualType
TransformElaboratedType(TypeLocBuilder & TLB,ElaboratedTypeLoc TL)5086 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5087 ElaboratedTypeLoc TL) {
5088 const ElaboratedType *T = TL.getTypePtr();
5089
5090 NestedNameSpecifierLoc QualifierLoc;
5091 // NOTE: the qualifier in an ElaboratedType is optional.
5092 if (TL.getQualifierLoc()) {
5093 QualifierLoc
5094 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5095 if (!QualifierLoc)
5096 return QualType();
5097 }
5098
5099 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5100 if (NamedT.isNull())
5101 return QualType();
5102
5103 // C++0x [dcl.type.elab]p2:
5104 // If the identifier resolves to a typedef-name or the simple-template-id
5105 // resolves to an alias template specialization, the
5106 // elaborated-type-specifier is ill-formed.
5107 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5108 if (const TemplateSpecializationType *TST =
5109 NamedT->getAs<TemplateSpecializationType>()) {
5110 TemplateName Template = TST->getTemplateName();
5111 if (TypeAliasTemplateDecl *TAT =
5112 dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) {
5113 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5114 diag::err_tag_reference_non_tag) << 4;
5115 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5116 }
5117 }
5118 }
5119
5120 QualType Result = TL.getType();
5121 if (getDerived().AlwaysRebuild() ||
5122 QualifierLoc != TL.getQualifierLoc() ||
5123 NamedT != T->getNamedType()) {
5124 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5125 T->getKeyword(),
5126 QualifierLoc, NamedT);
5127 if (Result.isNull())
5128 return QualType();
5129 }
5130
5131 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5132 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5133 NewTL.setQualifierLoc(QualifierLoc);
5134 return Result;
5135 }
5136
5137 template<typename Derived>
TransformAttributedType(TypeLocBuilder & TLB,AttributedTypeLoc TL)5138 QualType TreeTransform<Derived>::TransformAttributedType(
5139 TypeLocBuilder &TLB,
5140 AttributedTypeLoc TL) {
5141 const AttributedType *oldType = TL.getTypePtr();
5142 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5143 if (modifiedType.isNull())
5144 return QualType();
5145
5146 QualType result = TL.getType();
5147
5148 // FIXME: dependent operand expressions?
5149 if (getDerived().AlwaysRebuild() ||
5150 modifiedType != oldType->getModifiedType()) {
5151 // TODO: this is really lame; we should really be rebuilding the
5152 // equivalent type from first principles.
5153 QualType equivalentType
5154 = getDerived().TransformType(oldType->getEquivalentType());
5155 if (equivalentType.isNull())
5156 return QualType();
5157 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5158 modifiedType,
5159 equivalentType);
5160 }
5161
5162 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5163 newTL.setAttrNameLoc(TL.getAttrNameLoc());
5164 if (TL.hasAttrOperand())
5165 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5166 if (TL.hasAttrExprOperand())
5167 newTL.setAttrExprOperand(TL.getAttrExprOperand());
5168 else if (TL.hasAttrEnumOperand())
5169 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5170
5171 return result;
5172 }
5173
5174 template<typename Derived>
5175 QualType
TransformParenType(TypeLocBuilder & TLB,ParenTypeLoc TL)5176 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5177 ParenTypeLoc TL) {
5178 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5179 if (Inner.isNull())
5180 return QualType();
5181
5182 QualType Result = TL.getType();
5183 if (getDerived().AlwaysRebuild() ||
5184 Inner != TL.getInnerLoc().getType()) {
5185 Result = getDerived().RebuildParenType(Inner);
5186 if (Result.isNull())
5187 return QualType();
5188 }
5189
5190 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5191 NewTL.setLParenLoc(TL.getLParenLoc());
5192 NewTL.setRParenLoc(TL.getRParenLoc());
5193 return Result;
5194 }
5195
5196 template<typename Derived>
TransformDependentNameType(TypeLocBuilder & TLB,DependentNameTypeLoc TL)5197 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5198 DependentNameTypeLoc TL) {
5199 const DependentNameType *T = TL.getTypePtr();
5200
5201 NestedNameSpecifierLoc QualifierLoc
5202 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5203 if (!QualifierLoc)
5204 return QualType();
5205
5206 QualType Result
5207 = getDerived().RebuildDependentNameType(T->getKeyword(),
5208 TL.getElaboratedKeywordLoc(),
5209 QualifierLoc,
5210 T->getIdentifier(),
5211 TL.getNameLoc());
5212 if (Result.isNull())
5213 return QualType();
5214
5215 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5216 QualType NamedT = ElabT->getNamedType();
5217 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5218
5219 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5220 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5221 NewTL.setQualifierLoc(QualifierLoc);
5222 } else {
5223 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5224 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5225 NewTL.setQualifierLoc(QualifierLoc);
5226 NewTL.setNameLoc(TL.getNameLoc());
5227 }
5228 return Result;
5229 }
5230
5231 template<typename Derived>
5232 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL)5233 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5234 DependentTemplateSpecializationTypeLoc TL) {
5235 NestedNameSpecifierLoc QualifierLoc;
5236 if (TL.getQualifierLoc()) {
5237 QualifierLoc
5238 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5239 if (!QualifierLoc)
5240 return QualType();
5241 }
5242
5243 return getDerived()
5244 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5245 }
5246
5247 template<typename Derived>
5248 QualType TreeTransform<Derived>::
TransformDependentTemplateSpecializationType(TypeLocBuilder & TLB,DependentTemplateSpecializationTypeLoc TL,NestedNameSpecifierLoc QualifierLoc)5249 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5250 DependentTemplateSpecializationTypeLoc TL,
5251 NestedNameSpecifierLoc QualifierLoc) {
5252 const DependentTemplateSpecializationType *T = TL.getTypePtr();
5253
5254 TemplateArgumentListInfo NewTemplateArgs;
5255 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5256 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5257
5258 typedef TemplateArgumentLocContainerIterator<
5259 DependentTemplateSpecializationTypeLoc> ArgIterator;
5260 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5261 ArgIterator(TL, TL.getNumArgs()),
5262 NewTemplateArgs))
5263 return QualType();
5264
5265 QualType Result
5266 = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5267 QualifierLoc,
5268 T->getIdentifier(),
5269 TL.getTemplateNameLoc(),
5270 NewTemplateArgs);
5271 if (Result.isNull())
5272 return QualType();
5273
5274 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5275 QualType NamedT = ElabT->getNamedType();
5276
5277 // Copy information relevant to the template specialization.
5278 TemplateSpecializationTypeLoc NamedTL
5279 = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5280 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5281 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5282 NamedTL.setLAngleLoc(TL.getLAngleLoc());
5283 NamedTL.setRAngleLoc(TL.getRAngleLoc());
5284 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5285 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5286
5287 // Copy information relevant to the elaborated type.
5288 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5289 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5290 NewTL.setQualifierLoc(QualifierLoc);
5291 } else if (isa<DependentTemplateSpecializationType>(Result)) {
5292 DependentTemplateSpecializationTypeLoc SpecTL
5293 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5294 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5295 SpecTL.setQualifierLoc(QualifierLoc);
5296 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5297 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5298 SpecTL.setLAngleLoc(TL.getLAngleLoc());
5299 SpecTL.setRAngleLoc(TL.getRAngleLoc());
5300 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5301 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5302 } else {
5303 TemplateSpecializationTypeLoc SpecTL
5304 = TLB.push<TemplateSpecializationTypeLoc>(Result);
5305 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5306 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5307 SpecTL.setLAngleLoc(TL.getLAngleLoc());
5308 SpecTL.setRAngleLoc(TL.getRAngleLoc());
5309 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5310 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5311 }
5312 return Result;
5313 }
5314
5315 template<typename Derived>
TransformPackExpansionType(TypeLocBuilder & TLB,PackExpansionTypeLoc TL)5316 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5317 PackExpansionTypeLoc TL) {
5318 QualType Pattern
5319 = getDerived().TransformType(TLB, TL.getPatternLoc());
5320 if (Pattern.isNull())
5321 return QualType();
5322
5323 QualType Result = TL.getType();
5324 if (getDerived().AlwaysRebuild() ||
5325 Pattern != TL.getPatternLoc().getType()) {
5326 Result = getDerived().RebuildPackExpansionType(Pattern,
5327 TL.getPatternLoc().getSourceRange(),
5328 TL.getEllipsisLoc(),
5329 TL.getTypePtr()->getNumExpansions());
5330 if (Result.isNull())
5331 return QualType();
5332 }
5333
5334 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5335 NewT.setEllipsisLoc(TL.getEllipsisLoc());
5336 return Result;
5337 }
5338
5339 template<typename Derived>
5340 QualType
TransformObjCInterfaceType(TypeLocBuilder & TLB,ObjCInterfaceTypeLoc TL)5341 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5342 ObjCInterfaceTypeLoc TL) {
5343 // ObjCInterfaceType is never dependent.
5344 TLB.pushFullCopy(TL);
5345 return TL.getType();
5346 }
5347
5348 template<typename Derived>
5349 QualType
TransformObjCObjectType(TypeLocBuilder & TLB,ObjCObjectTypeLoc TL)5350 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5351 ObjCObjectTypeLoc TL) {
5352 // ObjCObjectType is never dependent.
5353 TLB.pushFullCopy(TL);
5354 return TL.getType();
5355 }
5356
5357 template<typename Derived>
5358 QualType
TransformObjCObjectPointerType(TypeLocBuilder & TLB,ObjCObjectPointerTypeLoc TL)5359 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
5360 ObjCObjectPointerTypeLoc TL) {
5361 // ObjCObjectPointerType is never dependent.
5362 TLB.pushFullCopy(TL);
5363 return TL.getType();
5364 }
5365
5366 //===----------------------------------------------------------------------===//
5367 // Statement transformation
5368 //===----------------------------------------------------------------------===//
5369 template<typename Derived>
5370 StmtResult
TransformNullStmt(NullStmt * S)5371 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
5372 return S;
5373 }
5374
5375 template<typename Derived>
5376 StmtResult
TransformCompoundStmt(CompoundStmt * S)5377 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
5378 return getDerived().TransformCompoundStmt(S, false);
5379 }
5380
5381 template<typename Derived>
5382 StmtResult
TransformCompoundStmt(CompoundStmt * S,bool IsStmtExpr)5383 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
5384 bool IsStmtExpr) {
5385 Sema::CompoundScopeRAII CompoundScope(getSema());
5386
5387 bool SubStmtInvalid = false;
5388 bool SubStmtChanged = false;
5389 SmallVector<Stmt*, 8> Statements;
5390 for (auto *B : S->body()) {
5391 StmtResult Result = getDerived().TransformStmt(B);
5392 if (Result.isInvalid()) {
5393 // Immediately fail if this was a DeclStmt, since it's very
5394 // likely that this will cause problems for future statements.
5395 if (isa<DeclStmt>(B))
5396 return StmtError();
5397
5398 // Otherwise, just keep processing substatements and fail later.
5399 SubStmtInvalid = true;
5400 continue;
5401 }
5402
5403 SubStmtChanged = SubStmtChanged || Result.get() != B;
5404 Statements.push_back(Result.getAs<Stmt>());
5405 }
5406
5407 if (SubStmtInvalid)
5408 return StmtError();
5409
5410 if (!getDerived().AlwaysRebuild() &&
5411 !SubStmtChanged)
5412 return S;
5413
5414 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
5415 Statements,
5416 S->getRBracLoc(),
5417 IsStmtExpr);
5418 }
5419
5420 template<typename Derived>
5421 StmtResult
TransformCaseStmt(CaseStmt * S)5422 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
5423 ExprResult LHS, RHS;
5424 {
5425 EnterExpressionEvaluationContext Unevaluated(SemaRef,
5426 Sema::ConstantEvaluated);
5427
5428 // Transform the left-hand case value.
5429 LHS = getDerived().TransformExpr(S->getLHS());
5430 LHS = SemaRef.ActOnConstantExpression(LHS);
5431 if (LHS.isInvalid())
5432 return StmtError();
5433
5434 // Transform the right-hand case value (for the GNU case-range extension).
5435 RHS = getDerived().TransformExpr(S->getRHS());
5436 RHS = SemaRef.ActOnConstantExpression(RHS);
5437 if (RHS.isInvalid())
5438 return StmtError();
5439 }
5440
5441 // Build the case statement.
5442 // Case statements are always rebuilt so that they will attached to their
5443 // transformed switch statement.
5444 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
5445 LHS.get(),
5446 S->getEllipsisLoc(),
5447 RHS.get(),
5448 S->getColonLoc());
5449 if (Case.isInvalid())
5450 return StmtError();
5451
5452 // Transform the statement following the case
5453 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5454 if (SubStmt.isInvalid())
5455 return StmtError();
5456
5457 // Attach the body to the case statement
5458 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
5459 }
5460
5461 template<typename Derived>
5462 StmtResult
TransformDefaultStmt(DefaultStmt * S)5463 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
5464 // Transform the statement following the default case
5465 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5466 if (SubStmt.isInvalid())
5467 return StmtError();
5468
5469 // Default statements are always rebuilt
5470 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
5471 SubStmt.get());
5472 }
5473
5474 template<typename Derived>
5475 StmtResult
TransformLabelStmt(LabelStmt * S)5476 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
5477 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5478 if (SubStmt.isInvalid())
5479 return StmtError();
5480
5481 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
5482 S->getDecl());
5483 if (!LD)
5484 return StmtError();
5485
5486
5487 // FIXME: Pass the real colon location in.
5488 return getDerived().RebuildLabelStmt(S->getIdentLoc(),
5489 cast<LabelDecl>(LD), SourceLocation(),
5490 SubStmt.get());
5491 }
5492
5493 template<typename Derived>
5494 StmtResult
TransformAttributedStmt(AttributedStmt * S)5495 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
5496 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5497 if (SubStmt.isInvalid())
5498 return StmtError();
5499
5500 // TODO: transform attributes
5501 if (SubStmt.get() == S->getSubStmt() /* && attrs are the same */)
5502 return S;
5503
5504 return getDerived().RebuildAttributedStmt(S->getAttrLoc(),
5505 S->getAttrs(),
5506 SubStmt.get());
5507 }
5508
5509 template<typename Derived>
5510 StmtResult
TransformIfStmt(IfStmt * S)5511 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
5512 // Transform the condition
5513 ExprResult Cond;
5514 VarDecl *ConditionVar = nullptr;
5515 if (S->getConditionVariable()) {
5516 ConditionVar
5517 = cast_or_null<VarDecl>(
5518 getDerived().TransformDefinition(
5519 S->getConditionVariable()->getLocation(),
5520 S->getConditionVariable()));
5521 if (!ConditionVar)
5522 return StmtError();
5523 } else {
5524 Cond = getDerived().TransformExpr(S->getCond());
5525
5526 if (Cond.isInvalid())
5527 return StmtError();
5528
5529 // Convert the condition to a boolean value.
5530 if (S->getCond()) {
5531 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, S->getIfLoc(),
5532 Cond.get());
5533 if (CondE.isInvalid())
5534 return StmtError();
5535
5536 Cond = CondE.get();
5537 }
5538 }
5539
5540 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5541 if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5542 return StmtError();
5543
5544 // Transform the "then" branch.
5545 StmtResult Then = getDerived().TransformStmt(S->getThen());
5546 if (Then.isInvalid())
5547 return StmtError();
5548
5549 // Transform the "else" branch.
5550 StmtResult Else = getDerived().TransformStmt(S->getElse());
5551 if (Else.isInvalid())
5552 return StmtError();
5553
5554 if (!getDerived().AlwaysRebuild() &&
5555 FullCond.get() == S->getCond() &&
5556 ConditionVar == S->getConditionVariable() &&
5557 Then.get() == S->getThen() &&
5558 Else.get() == S->getElse())
5559 return S;
5560
5561 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
5562 Then.get(),
5563 S->getElseLoc(), Else.get());
5564 }
5565
5566 template<typename Derived>
5567 StmtResult
TransformSwitchStmt(SwitchStmt * S)5568 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
5569 // Transform the condition.
5570 ExprResult Cond;
5571 VarDecl *ConditionVar = nullptr;
5572 if (S->getConditionVariable()) {
5573 ConditionVar
5574 = cast_or_null<VarDecl>(
5575 getDerived().TransformDefinition(
5576 S->getConditionVariable()->getLocation(),
5577 S->getConditionVariable()));
5578 if (!ConditionVar)
5579 return StmtError();
5580 } else {
5581 Cond = getDerived().TransformExpr(S->getCond());
5582
5583 if (Cond.isInvalid())
5584 return StmtError();
5585 }
5586
5587 // Rebuild the switch statement.
5588 StmtResult Switch
5589 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
5590 ConditionVar);
5591 if (Switch.isInvalid())
5592 return StmtError();
5593
5594 // Transform the body of the switch statement.
5595 StmtResult Body = getDerived().TransformStmt(S->getBody());
5596 if (Body.isInvalid())
5597 return StmtError();
5598
5599 // Complete the switch statement.
5600 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
5601 Body.get());
5602 }
5603
5604 template<typename Derived>
5605 StmtResult
TransformWhileStmt(WhileStmt * S)5606 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
5607 // Transform the condition
5608 ExprResult Cond;
5609 VarDecl *ConditionVar = nullptr;
5610 if (S->getConditionVariable()) {
5611 ConditionVar
5612 = cast_or_null<VarDecl>(
5613 getDerived().TransformDefinition(
5614 S->getConditionVariable()->getLocation(),
5615 S->getConditionVariable()));
5616 if (!ConditionVar)
5617 return StmtError();
5618 } else {
5619 Cond = getDerived().TransformExpr(S->getCond());
5620
5621 if (Cond.isInvalid())
5622 return StmtError();
5623
5624 if (S->getCond()) {
5625 // Convert the condition to a boolean value.
5626 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5627 S->getWhileLoc(),
5628 Cond.get());
5629 if (CondE.isInvalid())
5630 return StmtError();
5631 Cond = CondE;
5632 }
5633 }
5634
5635 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5636 if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5637 return StmtError();
5638
5639 // Transform the body
5640 StmtResult Body = getDerived().TransformStmt(S->getBody());
5641 if (Body.isInvalid())
5642 return StmtError();
5643
5644 if (!getDerived().AlwaysRebuild() &&
5645 FullCond.get() == S->getCond() &&
5646 ConditionVar == S->getConditionVariable() &&
5647 Body.get() == S->getBody())
5648 return Owned(S);
5649
5650 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
5651 ConditionVar, Body.get());
5652 }
5653
5654 template<typename Derived>
5655 StmtResult
TransformDoStmt(DoStmt * S)5656 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
5657 // Transform the body
5658 StmtResult Body = getDerived().TransformStmt(S->getBody());
5659 if (Body.isInvalid())
5660 return StmtError();
5661
5662 // Transform the condition
5663 ExprResult Cond = getDerived().TransformExpr(S->getCond());
5664 if (Cond.isInvalid())
5665 return StmtError();
5666
5667 if (!getDerived().AlwaysRebuild() &&
5668 Cond.get() == S->getCond() &&
5669 Body.get() == S->getBody())
5670 return S;
5671
5672 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
5673 /*FIXME:*/S->getWhileLoc(), Cond.get(),
5674 S->getRParenLoc());
5675 }
5676
5677 template<typename Derived>
5678 StmtResult
TransformForStmt(ForStmt * S)5679 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
5680 // Transform the initialization statement
5681 StmtResult Init = getDerived().TransformStmt(S->getInit());
5682 if (Init.isInvalid())
5683 return StmtError();
5684
5685 // Transform the condition
5686 ExprResult Cond;
5687 VarDecl *ConditionVar = nullptr;
5688 if (S->getConditionVariable()) {
5689 ConditionVar
5690 = cast_or_null<VarDecl>(
5691 getDerived().TransformDefinition(
5692 S->getConditionVariable()->getLocation(),
5693 S->getConditionVariable()));
5694 if (!ConditionVar)
5695 return StmtError();
5696 } else {
5697 Cond = getDerived().TransformExpr(S->getCond());
5698
5699 if (Cond.isInvalid())
5700 return StmtError();
5701
5702 if (S->getCond()) {
5703 // Convert the condition to a boolean value.
5704 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5705 S->getForLoc(),
5706 Cond.get());
5707 if (CondE.isInvalid())
5708 return StmtError();
5709
5710 Cond = CondE.get();
5711 }
5712 }
5713
5714 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5715 if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5716 return StmtError();
5717
5718 // Transform the increment
5719 ExprResult Inc = getDerived().TransformExpr(S->getInc());
5720 if (Inc.isInvalid())
5721 return StmtError();
5722
5723 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
5724 if (S->getInc() && !FullInc.get())
5725 return StmtError();
5726
5727 // Transform the body
5728 StmtResult Body = getDerived().TransformStmt(S->getBody());
5729 if (Body.isInvalid())
5730 return StmtError();
5731
5732 if (!getDerived().AlwaysRebuild() &&
5733 Init.get() == S->getInit() &&
5734 FullCond.get() == S->getCond() &&
5735 Inc.get() == S->getInc() &&
5736 Body.get() == S->getBody())
5737 return S;
5738
5739 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
5740 Init.get(), FullCond, ConditionVar,
5741 FullInc, S->getRParenLoc(), Body.get());
5742 }
5743
5744 template<typename Derived>
5745 StmtResult
TransformGotoStmt(GotoStmt * S)5746 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
5747 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
5748 S->getLabel());
5749 if (!LD)
5750 return StmtError();
5751
5752 // Goto statements must always be rebuilt, to resolve the label.
5753 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
5754 cast<LabelDecl>(LD));
5755 }
5756
5757 template<typename Derived>
5758 StmtResult
TransformIndirectGotoStmt(IndirectGotoStmt * S)5759 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
5760 ExprResult Target = getDerived().TransformExpr(S->getTarget());
5761 if (Target.isInvalid())
5762 return StmtError();
5763 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
5764
5765 if (!getDerived().AlwaysRebuild() &&
5766 Target.get() == S->getTarget())
5767 return S;
5768
5769 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
5770 Target.get());
5771 }
5772
5773 template<typename Derived>
5774 StmtResult
TransformContinueStmt(ContinueStmt * S)5775 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
5776 return S;
5777 }
5778
5779 template<typename Derived>
5780 StmtResult
TransformBreakStmt(BreakStmt * S)5781 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
5782 return S;
5783 }
5784
5785 template<typename Derived>
5786 StmtResult
TransformReturnStmt(ReturnStmt * S)5787 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
5788 ExprResult Result = getDerived().TransformExpr(S->getRetValue());
5789 if (Result.isInvalid())
5790 return StmtError();
5791
5792 // FIXME: We always rebuild the return statement because there is no way
5793 // to tell whether the return type of the function has changed.
5794 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
5795 }
5796
5797 template<typename Derived>
5798 StmtResult
TransformDeclStmt(DeclStmt * S)5799 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
5800 bool DeclChanged = false;
5801 SmallVector<Decl *, 4> Decls;
5802 for (auto *D : S->decls()) {
5803 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
5804 if (!Transformed)
5805 return StmtError();
5806
5807 if (Transformed != D)
5808 DeclChanged = true;
5809
5810 Decls.push_back(Transformed);
5811 }
5812
5813 if (!getDerived().AlwaysRebuild() && !DeclChanged)
5814 return S;
5815
5816 return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
5817 }
5818
5819 template<typename Derived>
5820 StmtResult
TransformGCCAsmStmt(GCCAsmStmt * S)5821 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
5822
5823 SmallVector<Expr*, 8> Constraints;
5824 SmallVector<Expr*, 8> Exprs;
5825 SmallVector<IdentifierInfo *, 4> Names;
5826
5827 ExprResult AsmString;
5828 SmallVector<Expr*, 8> Clobbers;
5829
5830 bool ExprsChanged = false;
5831
5832 // Go through the outputs.
5833 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
5834 Names.push_back(S->getOutputIdentifier(I));
5835
5836 // No need to transform the constraint literal.
5837 Constraints.push_back(S->getOutputConstraintLiteral(I));
5838
5839 // Transform the output expr.
5840 Expr *OutputExpr = S->getOutputExpr(I);
5841 ExprResult Result = getDerived().TransformExpr(OutputExpr);
5842 if (Result.isInvalid())
5843 return StmtError();
5844
5845 ExprsChanged |= Result.get() != OutputExpr;
5846
5847 Exprs.push_back(Result.get());
5848 }
5849
5850 // Go through the inputs.
5851 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
5852 Names.push_back(S->getInputIdentifier(I));
5853
5854 // No need to transform the constraint literal.
5855 Constraints.push_back(S->getInputConstraintLiteral(I));
5856
5857 // Transform the input expr.
5858 Expr *InputExpr = S->getInputExpr(I);
5859 ExprResult Result = getDerived().TransformExpr(InputExpr);
5860 if (Result.isInvalid())
5861 return StmtError();
5862
5863 ExprsChanged |= Result.get() != InputExpr;
5864
5865 Exprs.push_back(Result.get());
5866 }
5867
5868 if (!getDerived().AlwaysRebuild() && !ExprsChanged)
5869 return S;
5870
5871 // Go through the clobbers.
5872 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
5873 Clobbers.push_back(S->getClobberStringLiteral(I));
5874
5875 // No need to transform the asm string literal.
5876 AsmString = S->getAsmString();
5877 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
5878 S->isVolatile(), S->getNumOutputs(),
5879 S->getNumInputs(), Names.data(),
5880 Constraints, Exprs, AsmString.get(),
5881 Clobbers, S->getRParenLoc());
5882 }
5883
5884 template<typename Derived>
5885 StmtResult
TransformMSAsmStmt(MSAsmStmt * S)5886 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
5887 ArrayRef<Token> AsmToks =
5888 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
5889
5890 bool HadError = false, HadChange = false;
5891
5892 ArrayRef<Expr*> SrcExprs = S->getAllExprs();
5893 SmallVector<Expr*, 8> TransformedExprs;
5894 TransformedExprs.reserve(SrcExprs.size());
5895 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
5896 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
5897 if (!Result.isUsable()) {
5898 HadError = true;
5899 } else {
5900 HadChange |= (Result.get() != SrcExprs[i]);
5901 TransformedExprs.push_back(Result.get());
5902 }
5903 }
5904
5905 if (HadError) return StmtError();
5906 if (!HadChange && !getDerived().AlwaysRebuild())
5907 return Owned(S);
5908
5909 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
5910 AsmToks, S->getAsmString(),
5911 S->getNumOutputs(), S->getNumInputs(),
5912 S->getAllConstraints(), S->getClobbers(),
5913 TransformedExprs, S->getEndLoc());
5914 }
5915
5916 template<typename Derived>
5917 StmtResult
TransformObjCAtTryStmt(ObjCAtTryStmt * S)5918 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
5919 // Transform the body of the @try.
5920 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
5921 if (TryBody.isInvalid())
5922 return StmtError();
5923
5924 // Transform the @catch statements (if present).
5925 bool AnyCatchChanged = false;
5926 SmallVector<Stmt*, 8> CatchStmts;
5927 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
5928 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
5929 if (Catch.isInvalid())
5930 return StmtError();
5931 if (Catch.get() != S->getCatchStmt(I))
5932 AnyCatchChanged = true;
5933 CatchStmts.push_back(Catch.get());
5934 }
5935
5936 // Transform the @finally statement (if present).
5937 StmtResult Finally;
5938 if (S->getFinallyStmt()) {
5939 Finally = getDerived().TransformStmt(S->getFinallyStmt());
5940 if (Finally.isInvalid())
5941 return StmtError();
5942 }
5943
5944 // If nothing changed, just retain this statement.
5945 if (!getDerived().AlwaysRebuild() &&
5946 TryBody.get() == S->getTryBody() &&
5947 !AnyCatchChanged &&
5948 Finally.get() == S->getFinallyStmt())
5949 return S;
5950
5951 // Build a new statement.
5952 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
5953 CatchStmts, Finally.get());
5954 }
5955
5956 template<typename Derived>
5957 StmtResult
TransformObjCAtCatchStmt(ObjCAtCatchStmt * S)5958 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
5959 // Transform the @catch parameter, if there is one.
5960 VarDecl *Var = nullptr;
5961 if (VarDecl *FromVar = S->getCatchParamDecl()) {
5962 TypeSourceInfo *TSInfo = nullptr;
5963 if (FromVar->getTypeSourceInfo()) {
5964 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
5965 if (!TSInfo)
5966 return StmtError();
5967 }
5968
5969 QualType T;
5970 if (TSInfo)
5971 T = TSInfo->getType();
5972 else {
5973 T = getDerived().TransformType(FromVar->getType());
5974 if (T.isNull())
5975 return StmtError();
5976 }
5977
5978 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
5979 if (!Var)
5980 return StmtError();
5981 }
5982
5983 StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
5984 if (Body.isInvalid())
5985 return StmtError();
5986
5987 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
5988 S->getRParenLoc(),
5989 Var, Body.get());
5990 }
5991
5992 template<typename Derived>
5993 StmtResult
TransformObjCAtFinallyStmt(ObjCAtFinallyStmt * S)5994 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
5995 // Transform the body.
5996 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
5997 if (Body.isInvalid())
5998 return StmtError();
5999
6000 // If nothing changed, just retain this statement.
6001 if (!getDerived().AlwaysRebuild() &&
6002 Body.get() == S->getFinallyBody())
6003 return S;
6004
6005 // Build a new statement.
6006 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6007 Body.get());
6008 }
6009
6010 template<typename Derived>
6011 StmtResult
TransformObjCAtThrowStmt(ObjCAtThrowStmt * S)6012 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6013 ExprResult Operand;
6014 if (S->getThrowExpr()) {
6015 Operand = getDerived().TransformExpr(S->getThrowExpr());
6016 if (Operand.isInvalid())
6017 return StmtError();
6018 }
6019
6020 if (!getDerived().AlwaysRebuild() &&
6021 Operand.get() == S->getThrowExpr())
6022 return S;
6023
6024 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6025 }
6026
6027 template<typename Derived>
6028 StmtResult
TransformObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)6029 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6030 ObjCAtSynchronizedStmt *S) {
6031 // Transform the object we are locking.
6032 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6033 if (Object.isInvalid())
6034 return StmtError();
6035 Object =
6036 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6037 Object.get());
6038 if (Object.isInvalid())
6039 return StmtError();
6040
6041 // Transform the body.
6042 StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6043 if (Body.isInvalid())
6044 return StmtError();
6045
6046 // If nothing change, just retain the current statement.
6047 if (!getDerived().AlwaysRebuild() &&
6048 Object.get() == S->getSynchExpr() &&
6049 Body.get() == S->getSynchBody())
6050 return S;
6051
6052 // Build a new statement.
6053 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6054 Object.get(), Body.get());
6055 }
6056
6057 template<typename Derived>
6058 StmtResult
TransformObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)6059 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6060 ObjCAutoreleasePoolStmt *S) {
6061 // Transform the body.
6062 StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6063 if (Body.isInvalid())
6064 return StmtError();
6065
6066 // If nothing changed, just retain this statement.
6067 if (!getDerived().AlwaysRebuild() &&
6068 Body.get() == S->getSubStmt())
6069 return S;
6070
6071 // Build a new statement.
6072 return getDerived().RebuildObjCAutoreleasePoolStmt(
6073 S->getAtLoc(), Body.get());
6074 }
6075
6076 template<typename Derived>
6077 StmtResult
TransformObjCForCollectionStmt(ObjCForCollectionStmt * S)6078 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6079 ObjCForCollectionStmt *S) {
6080 // Transform the element statement.
6081 StmtResult Element = getDerived().TransformStmt(S->getElement());
6082 if (Element.isInvalid())
6083 return StmtError();
6084
6085 // Transform the collection expression.
6086 ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6087 if (Collection.isInvalid())
6088 return StmtError();
6089
6090 // Transform the body.
6091 StmtResult Body = getDerived().TransformStmt(S->getBody());
6092 if (Body.isInvalid())
6093 return StmtError();
6094
6095 // If nothing changed, just retain this statement.
6096 if (!getDerived().AlwaysRebuild() &&
6097 Element.get() == S->getElement() &&
6098 Collection.get() == S->getCollection() &&
6099 Body.get() == S->getBody())
6100 return S;
6101
6102 // Build a new statement.
6103 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6104 Element.get(),
6105 Collection.get(),
6106 S->getRParenLoc(),
6107 Body.get());
6108 }
6109
6110 template <typename Derived>
TransformCXXCatchStmt(CXXCatchStmt * S)6111 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6112 // Transform the exception declaration, if any.
6113 VarDecl *Var = nullptr;
6114 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6115 TypeSourceInfo *T =
6116 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6117 if (!T)
6118 return StmtError();
6119
6120 Var = getDerived().RebuildExceptionDecl(
6121 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6122 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6123 if (!Var || Var->isInvalidDecl())
6124 return StmtError();
6125 }
6126
6127 // Transform the actual exception handler.
6128 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6129 if (Handler.isInvalid())
6130 return StmtError();
6131
6132 if (!getDerived().AlwaysRebuild() && !Var &&
6133 Handler.get() == S->getHandlerBlock())
6134 return S;
6135
6136 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6137 }
6138
6139 template <typename Derived>
TransformCXXTryStmt(CXXTryStmt * S)6140 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6141 // Transform the try block itself.
6142 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6143 if (TryBlock.isInvalid())
6144 return StmtError();
6145
6146 // Transform the handlers.
6147 bool HandlerChanged = false;
6148 SmallVector<Stmt *, 8> Handlers;
6149 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6150 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6151 if (Handler.isInvalid())
6152 return StmtError();
6153
6154 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6155 Handlers.push_back(Handler.getAs<Stmt>());
6156 }
6157
6158 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6159 !HandlerChanged)
6160 return S;
6161
6162 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6163 Handlers);
6164 }
6165
6166 template<typename Derived>
6167 StmtResult
TransformCXXForRangeStmt(CXXForRangeStmt * S)6168 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6169 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6170 if (Range.isInvalid())
6171 return StmtError();
6172
6173 StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt());
6174 if (BeginEnd.isInvalid())
6175 return StmtError();
6176
6177 ExprResult Cond = getDerived().TransformExpr(S->getCond());
6178 if (Cond.isInvalid())
6179 return StmtError();
6180 if (Cond.get())
6181 Cond = SemaRef.CheckBooleanCondition(Cond.get(), S->getColonLoc());
6182 if (Cond.isInvalid())
6183 return StmtError();
6184 if (Cond.get())
6185 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6186
6187 ExprResult Inc = getDerived().TransformExpr(S->getInc());
6188 if (Inc.isInvalid())
6189 return StmtError();
6190 if (Inc.get())
6191 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6192
6193 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6194 if (LoopVar.isInvalid())
6195 return StmtError();
6196
6197 StmtResult NewStmt = S;
6198 if (getDerived().AlwaysRebuild() ||
6199 Range.get() != S->getRangeStmt() ||
6200 BeginEnd.get() != S->getBeginEndStmt() ||
6201 Cond.get() != S->getCond() ||
6202 Inc.get() != S->getInc() ||
6203 LoopVar.get() != S->getLoopVarStmt()) {
6204 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6205 S->getColonLoc(), Range.get(),
6206 BeginEnd.get(), Cond.get(),
6207 Inc.get(), LoopVar.get(),
6208 S->getRParenLoc());
6209 if (NewStmt.isInvalid())
6210 return StmtError();
6211 }
6212
6213 StmtResult Body = getDerived().TransformStmt(S->getBody());
6214 if (Body.isInvalid())
6215 return StmtError();
6216
6217 // Body has changed but we didn't rebuild the for-range statement. Rebuild
6218 // it now so we have a new statement to attach the body to.
6219 if (Body.get() != S->getBody() && NewStmt.get() == S) {
6220 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6221 S->getColonLoc(), Range.get(),
6222 BeginEnd.get(), Cond.get(),
6223 Inc.get(), LoopVar.get(),
6224 S->getRParenLoc());
6225 if (NewStmt.isInvalid())
6226 return StmtError();
6227 }
6228
6229 if (NewStmt.get() == S)
6230 return S;
6231
6232 return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
6233 }
6234
6235 template<typename Derived>
6236 StmtResult
TransformMSDependentExistsStmt(MSDependentExistsStmt * S)6237 TreeTransform<Derived>::TransformMSDependentExistsStmt(
6238 MSDependentExistsStmt *S) {
6239 // Transform the nested-name-specifier, if any.
6240 NestedNameSpecifierLoc QualifierLoc;
6241 if (S->getQualifierLoc()) {
6242 QualifierLoc
6243 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
6244 if (!QualifierLoc)
6245 return StmtError();
6246 }
6247
6248 // Transform the declaration name.
6249 DeclarationNameInfo NameInfo = S->getNameInfo();
6250 if (NameInfo.getName()) {
6251 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
6252 if (!NameInfo.getName())
6253 return StmtError();
6254 }
6255
6256 // Check whether anything changed.
6257 if (!getDerived().AlwaysRebuild() &&
6258 QualifierLoc == S->getQualifierLoc() &&
6259 NameInfo.getName() == S->getNameInfo().getName())
6260 return S;
6261
6262 // Determine whether this name exists, if we can.
6263 CXXScopeSpec SS;
6264 SS.Adopt(QualifierLoc);
6265 bool Dependent = false;
6266 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
6267 case Sema::IER_Exists:
6268 if (S->isIfExists())
6269 break;
6270
6271 return new (getSema().Context) NullStmt(S->getKeywordLoc());
6272
6273 case Sema::IER_DoesNotExist:
6274 if (S->isIfNotExists())
6275 break;
6276
6277 return new (getSema().Context) NullStmt(S->getKeywordLoc());
6278
6279 case Sema::IER_Dependent:
6280 Dependent = true;
6281 break;
6282
6283 case Sema::IER_Error:
6284 return StmtError();
6285 }
6286
6287 // We need to continue with the instantiation, so do so now.
6288 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
6289 if (SubStmt.isInvalid())
6290 return StmtError();
6291
6292 // If we have resolved the name, just transform to the substatement.
6293 if (!Dependent)
6294 return SubStmt;
6295
6296 // The name is still dependent, so build a dependent expression again.
6297 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
6298 S->isIfExists(),
6299 QualifierLoc,
6300 NameInfo,
6301 SubStmt.get());
6302 }
6303
6304 template<typename Derived>
6305 ExprResult
TransformMSPropertyRefExpr(MSPropertyRefExpr * E)6306 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
6307 NestedNameSpecifierLoc QualifierLoc;
6308 if (E->getQualifierLoc()) {
6309 QualifierLoc
6310 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
6311 if (!QualifierLoc)
6312 return ExprError();
6313 }
6314
6315 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
6316 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
6317 if (!PD)
6318 return ExprError();
6319
6320 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
6321 if (Base.isInvalid())
6322 return ExprError();
6323
6324 return new (SemaRef.getASTContext())
6325 MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
6326 SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
6327 QualifierLoc, E->getMemberLoc());
6328 }
6329
6330 template <typename Derived>
TransformSEHTryStmt(SEHTryStmt * S)6331 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
6332 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6333 if (TryBlock.isInvalid())
6334 return StmtError();
6335
6336 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
6337 if (Handler.isInvalid())
6338 return StmtError();
6339
6340 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6341 Handler.get() == S->getHandler())
6342 return S;
6343
6344 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
6345 TryBlock.get(), Handler.get());
6346 }
6347
6348 template <typename Derived>
TransformSEHFinallyStmt(SEHFinallyStmt * S)6349 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
6350 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6351 if (Block.isInvalid())
6352 return StmtError();
6353
6354 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
6355 }
6356
6357 template <typename Derived>
TransformSEHExceptStmt(SEHExceptStmt * S)6358 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
6359 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
6360 if (FilterExpr.isInvalid())
6361 return StmtError();
6362
6363 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6364 if (Block.isInvalid())
6365 return StmtError();
6366
6367 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
6368 Block.get());
6369 }
6370
6371 template <typename Derived>
TransformSEHHandler(Stmt * Handler)6372 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
6373 if (isa<SEHFinallyStmt>(Handler))
6374 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
6375 else
6376 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
6377 }
6378
6379 template<typename Derived>
6380 StmtResult
TransformSEHLeaveStmt(SEHLeaveStmt * S)6381 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
6382 return S;
6383 }
6384
6385 //===----------------------------------------------------------------------===//
6386 // OpenMP directive transformation
6387 //===----------------------------------------------------------------------===//
6388 template <typename Derived>
TransformOMPExecutableDirective(OMPExecutableDirective * D)6389 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
6390 OMPExecutableDirective *D) {
6391
6392 // Transform the clauses
6393 llvm::SmallVector<OMPClause *, 16> TClauses;
6394 ArrayRef<OMPClause *> Clauses = D->clauses();
6395 TClauses.reserve(Clauses.size());
6396 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
6397 I != E; ++I) {
6398 if (*I) {
6399 OMPClause *Clause = getDerived().TransformOMPClause(*I);
6400 if (Clause)
6401 TClauses.push_back(Clause);
6402 } else {
6403 TClauses.push_back(nullptr);
6404 }
6405 }
6406 if (!D->getAssociatedStmt()) {
6407 return StmtError();
6408 }
6409 StmtResult AssociatedStmt =
6410 getDerived().TransformStmt(D->getAssociatedStmt());
6411 if (AssociatedStmt.isInvalid() || TClauses.size() != Clauses.size()) {
6412 return StmtError();
6413 }
6414
6415 return getDerived().RebuildOMPExecutableDirective(
6416 D->getDirectiveKind(), TClauses, AssociatedStmt.get(), D->getLocStart(),
6417 D->getLocEnd());
6418 }
6419
6420 template <typename Derived>
6421 StmtResult
TransformOMPParallelDirective(OMPParallelDirective * D)6422 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
6423 DeclarationNameInfo DirName;
6424 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
6425 D->getLocStart());
6426 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6427 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6428 return Res;
6429 }
6430
6431 template <typename Derived>
6432 StmtResult
TransformOMPSimdDirective(OMPSimdDirective * D)6433 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
6434 DeclarationNameInfo DirName;
6435 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
6436 D->getLocStart());
6437 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6438 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6439 return Res;
6440 }
6441
6442 template <typename Derived>
6443 StmtResult
TransformOMPForDirective(OMPForDirective * D)6444 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
6445 DeclarationNameInfo DirName;
6446 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
6447 D->getLocStart());
6448 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6449 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6450 return Res;
6451 }
6452
6453 template <typename Derived>
6454 StmtResult
TransformOMPSectionsDirective(OMPSectionsDirective * D)6455 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
6456 DeclarationNameInfo DirName;
6457 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
6458 D->getLocStart());
6459 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6460 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6461 return Res;
6462 }
6463
6464 template <typename Derived>
6465 StmtResult
TransformOMPSectionDirective(OMPSectionDirective * D)6466 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
6467 DeclarationNameInfo DirName;
6468 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
6469 D->getLocStart());
6470 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6471 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6472 return Res;
6473 }
6474
6475 template <typename Derived>
6476 StmtResult
TransformOMPSingleDirective(OMPSingleDirective * D)6477 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
6478 DeclarationNameInfo DirName;
6479 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
6480 D->getLocStart());
6481 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6482 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6483 return Res;
6484 }
6485
6486 template <typename Derived>
TransformOMPParallelForDirective(OMPParallelForDirective * D)6487 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
6488 OMPParallelForDirective *D) {
6489 DeclarationNameInfo DirName;
6490 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
6491 nullptr, D->getLocStart());
6492 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6493 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6494 return Res;
6495 }
6496
6497 template <typename Derived>
TransformOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)6498 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
6499 OMPParallelSectionsDirective *D) {
6500 DeclarationNameInfo DirName;
6501 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
6502 nullptr, D->getLocStart());
6503 StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6504 getDerived().getSema().EndOpenMPDSABlock(Res.get());
6505 return Res;
6506 }
6507
6508 //===----------------------------------------------------------------------===//
6509 // OpenMP clause transformation
6510 //===----------------------------------------------------------------------===//
6511 template <typename Derived>
TransformOMPIfClause(OMPIfClause * C)6512 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
6513 ExprResult Cond = getDerived().TransformExpr(C->getCondition());
6514 if (Cond.isInvalid())
6515 return nullptr;
6516 return getDerived().RebuildOMPIfClause(Cond.get(), C->getLocStart(),
6517 C->getLParenLoc(), C->getLocEnd());
6518 }
6519
6520 template <typename Derived>
6521 OMPClause *
TransformOMPNumThreadsClause(OMPNumThreadsClause * C)6522 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
6523 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
6524 if (NumThreads.isInvalid())
6525 return nullptr;
6526 return getDerived().RebuildOMPNumThreadsClause(
6527 NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6528 }
6529
6530 template <typename Derived>
6531 OMPClause *
TransformOMPSafelenClause(OMPSafelenClause * C)6532 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
6533 ExprResult E = getDerived().TransformExpr(C->getSafelen());
6534 if (E.isInvalid())
6535 return nullptr;
6536 return getDerived().RebuildOMPSafelenClause(
6537 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6538 }
6539
6540 template <typename Derived>
6541 OMPClause *
TransformOMPCollapseClause(OMPCollapseClause * C)6542 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
6543 ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
6544 if (E.isInvalid())
6545 return 0;
6546 return getDerived().RebuildOMPCollapseClause(
6547 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6548 }
6549
6550 template <typename Derived>
6551 OMPClause *
TransformOMPDefaultClause(OMPDefaultClause * C)6552 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
6553 return getDerived().RebuildOMPDefaultClause(
6554 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
6555 C->getLParenLoc(), C->getLocEnd());
6556 }
6557
6558 template <typename Derived>
6559 OMPClause *
TransformOMPProcBindClause(OMPProcBindClause * C)6560 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
6561 return getDerived().RebuildOMPProcBindClause(
6562 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
6563 C->getLParenLoc(), C->getLocEnd());
6564 }
6565
6566 template <typename Derived>
6567 OMPClause *
TransformOMPScheduleClause(OMPScheduleClause * C)6568 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
6569 ExprResult E = getDerived().TransformExpr(C->getChunkSize());
6570 if (E.isInvalid())
6571 return nullptr;
6572 return getDerived().RebuildOMPScheduleClause(
6573 C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
6574 C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
6575 }
6576
6577 template <typename Derived>
6578 OMPClause *
TransformOMPOrderedClause(OMPOrderedClause * C)6579 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
6580 // No need to rebuild this clause, no template-dependent parameters.
6581 return C;
6582 }
6583
6584 template <typename Derived>
6585 OMPClause *
TransformOMPNowaitClause(OMPNowaitClause * C)6586 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
6587 // No need to rebuild this clause, no template-dependent parameters.
6588 return C;
6589 }
6590
6591 template <typename Derived>
6592 OMPClause *
TransformOMPPrivateClause(OMPPrivateClause * C)6593 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
6594 llvm::SmallVector<Expr *, 16> Vars;
6595 Vars.reserve(C->varlist_size());
6596 for (auto *VE : C->varlists()) {
6597 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6598 if (EVar.isInvalid())
6599 return nullptr;
6600 Vars.push_back(EVar.get());
6601 }
6602 return getDerived().RebuildOMPPrivateClause(
6603 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6604 }
6605
6606 template <typename Derived>
TransformOMPFirstprivateClause(OMPFirstprivateClause * C)6607 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
6608 OMPFirstprivateClause *C) {
6609 llvm::SmallVector<Expr *, 16> Vars;
6610 Vars.reserve(C->varlist_size());
6611 for (auto *VE : C->varlists()) {
6612 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6613 if (EVar.isInvalid())
6614 return nullptr;
6615 Vars.push_back(EVar.get());
6616 }
6617 return getDerived().RebuildOMPFirstprivateClause(
6618 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6619 }
6620
6621 template <typename Derived>
6622 OMPClause *
TransformOMPLastprivateClause(OMPLastprivateClause * C)6623 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
6624 llvm::SmallVector<Expr *, 16> Vars;
6625 Vars.reserve(C->varlist_size());
6626 for (auto *VE : C->varlists()) {
6627 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6628 if (EVar.isInvalid())
6629 return nullptr;
6630 Vars.push_back(EVar.get());
6631 }
6632 return getDerived().RebuildOMPLastprivateClause(
6633 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6634 }
6635
6636 template <typename Derived>
6637 OMPClause *
TransformOMPSharedClause(OMPSharedClause * C)6638 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
6639 llvm::SmallVector<Expr *, 16> Vars;
6640 Vars.reserve(C->varlist_size());
6641 for (auto *VE : C->varlists()) {
6642 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6643 if (EVar.isInvalid())
6644 return nullptr;
6645 Vars.push_back(EVar.get());
6646 }
6647 return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
6648 C->getLParenLoc(), C->getLocEnd());
6649 }
6650
6651 template <typename Derived>
6652 OMPClause *
TransformOMPReductionClause(OMPReductionClause * C)6653 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
6654 llvm::SmallVector<Expr *, 16> Vars;
6655 Vars.reserve(C->varlist_size());
6656 for (auto *VE : C->varlists()) {
6657 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6658 if (EVar.isInvalid())
6659 return nullptr;
6660 Vars.push_back(EVar.get());
6661 }
6662 CXXScopeSpec ReductionIdScopeSpec;
6663 ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
6664
6665 DeclarationNameInfo NameInfo = C->getNameInfo();
6666 if (NameInfo.getName()) {
6667 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
6668 if (!NameInfo.getName())
6669 return nullptr;
6670 }
6671 return getDerived().RebuildOMPReductionClause(
6672 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
6673 C->getLocEnd(), ReductionIdScopeSpec, NameInfo);
6674 }
6675
6676 template <typename Derived>
6677 OMPClause *
TransformOMPLinearClause(OMPLinearClause * C)6678 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
6679 llvm::SmallVector<Expr *, 16> Vars;
6680 Vars.reserve(C->varlist_size());
6681 for (auto *VE : C->varlists()) {
6682 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6683 if (EVar.isInvalid())
6684 return nullptr;
6685 Vars.push_back(EVar.get());
6686 }
6687 ExprResult Step = getDerived().TransformExpr(C->getStep());
6688 if (Step.isInvalid())
6689 return nullptr;
6690 return getDerived().RebuildOMPLinearClause(Vars, Step.get(), C->getLocStart(),
6691 C->getLParenLoc(),
6692 C->getColonLoc(), C->getLocEnd());
6693 }
6694
6695 template <typename Derived>
6696 OMPClause *
TransformOMPAlignedClause(OMPAlignedClause * C)6697 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
6698 llvm::SmallVector<Expr *, 16> Vars;
6699 Vars.reserve(C->varlist_size());
6700 for (auto *VE : C->varlists()) {
6701 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6702 if (EVar.isInvalid())
6703 return nullptr;
6704 Vars.push_back(EVar.get());
6705 }
6706 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
6707 if (Alignment.isInvalid())
6708 return nullptr;
6709 return getDerived().RebuildOMPAlignedClause(
6710 Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
6711 C->getColonLoc(), C->getLocEnd());
6712 }
6713
6714 template <typename Derived>
6715 OMPClause *
TransformOMPCopyinClause(OMPCopyinClause * C)6716 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
6717 llvm::SmallVector<Expr *, 16> Vars;
6718 Vars.reserve(C->varlist_size());
6719 for (auto *VE : C->varlists()) {
6720 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6721 if (EVar.isInvalid())
6722 return nullptr;
6723 Vars.push_back(EVar.get());
6724 }
6725 return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
6726 C->getLParenLoc(), C->getLocEnd());
6727 }
6728
6729 template <typename Derived>
6730 OMPClause *
TransformOMPCopyprivateClause(OMPCopyprivateClause * C)6731 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
6732 llvm::SmallVector<Expr *, 16> Vars;
6733 Vars.reserve(C->varlist_size());
6734 for (auto *VE : C->varlists()) {
6735 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
6736 if (EVar.isInvalid())
6737 return nullptr;
6738 Vars.push_back(EVar.get());
6739 }
6740 return getDerived().RebuildOMPCopyprivateClause(
6741 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6742 }
6743
6744 //===----------------------------------------------------------------------===//
6745 // Expression transformation
6746 //===----------------------------------------------------------------------===//
6747 template<typename Derived>
6748 ExprResult
TransformPredefinedExpr(PredefinedExpr * E)6749 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
6750 return E;
6751 }
6752
6753 template<typename Derived>
6754 ExprResult
TransformDeclRefExpr(DeclRefExpr * E)6755 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
6756 NestedNameSpecifierLoc QualifierLoc;
6757 if (E->getQualifierLoc()) {
6758 QualifierLoc
6759 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
6760 if (!QualifierLoc)
6761 return ExprError();
6762 }
6763
6764 ValueDecl *ND
6765 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
6766 E->getDecl()));
6767 if (!ND)
6768 return ExprError();
6769
6770 DeclarationNameInfo NameInfo = E->getNameInfo();
6771 if (NameInfo.getName()) {
6772 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
6773 if (!NameInfo.getName())
6774 return ExprError();
6775 }
6776
6777 if (!getDerived().AlwaysRebuild() &&
6778 QualifierLoc == E->getQualifierLoc() &&
6779 ND == E->getDecl() &&
6780 NameInfo.getName() == E->getDecl()->getDeclName() &&
6781 !E->hasExplicitTemplateArgs()) {
6782
6783 // Mark it referenced in the new context regardless.
6784 // FIXME: this is a bit instantiation-specific.
6785 SemaRef.MarkDeclRefReferenced(E);
6786
6787 return E;
6788 }
6789
6790 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
6791 if (E->hasExplicitTemplateArgs()) {
6792 TemplateArgs = &TransArgs;
6793 TransArgs.setLAngleLoc(E->getLAngleLoc());
6794 TransArgs.setRAngleLoc(E->getRAngleLoc());
6795 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
6796 E->getNumTemplateArgs(),
6797 TransArgs))
6798 return ExprError();
6799 }
6800
6801 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
6802 TemplateArgs);
6803 }
6804
6805 template<typename Derived>
6806 ExprResult
TransformIntegerLiteral(IntegerLiteral * E)6807 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
6808 return E;
6809 }
6810
6811 template<typename Derived>
6812 ExprResult
TransformFloatingLiteral(FloatingLiteral * E)6813 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
6814 return E;
6815 }
6816
6817 template<typename Derived>
6818 ExprResult
TransformImaginaryLiteral(ImaginaryLiteral * E)6819 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
6820 return E;
6821 }
6822
6823 template<typename Derived>
6824 ExprResult
TransformStringLiteral(StringLiteral * E)6825 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
6826 return E;
6827 }
6828
6829 template<typename Derived>
6830 ExprResult
TransformCharacterLiteral(CharacterLiteral * E)6831 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
6832 return E;
6833 }
6834
6835 template<typename Derived>
6836 ExprResult
TransformUserDefinedLiteral(UserDefinedLiteral * E)6837 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
6838 if (FunctionDecl *FD = E->getDirectCallee())
6839 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
6840 return SemaRef.MaybeBindToTemporary(E);
6841 }
6842
6843 template<typename Derived>
6844 ExprResult
TransformGenericSelectionExpr(GenericSelectionExpr * E)6845 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
6846 ExprResult ControllingExpr =
6847 getDerived().TransformExpr(E->getControllingExpr());
6848 if (ControllingExpr.isInvalid())
6849 return ExprError();
6850
6851 SmallVector<Expr *, 4> AssocExprs;
6852 SmallVector<TypeSourceInfo *, 4> AssocTypes;
6853 for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
6854 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
6855 if (TS) {
6856 TypeSourceInfo *AssocType = getDerived().TransformType(TS);
6857 if (!AssocType)
6858 return ExprError();
6859 AssocTypes.push_back(AssocType);
6860 } else {
6861 AssocTypes.push_back(nullptr);
6862 }
6863
6864 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
6865 if (AssocExpr.isInvalid())
6866 return ExprError();
6867 AssocExprs.push_back(AssocExpr.get());
6868 }
6869
6870 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
6871 E->getDefaultLoc(),
6872 E->getRParenLoc(),
6873 ControllingExpr.get(),
6874 AssocTypes,
6875 AssocExprs);
6876 }
6877
6878 template<typename Derived>
6879 ExprResult
TransformParenExpr(ParenExpr * E)6880 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
6881 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
6882 if (SubExpr.isInvalid())
6883 return ExprError();
6884
6885 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
6886 return E;
6887
6888 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
6889 E->getRParen());
6890 }
6891
6892 /// \brief The operand of a unary address-of operator has special rules: it's
6893 /// allowed to refer to a non-static member of a class even if there's no 'this'
6894 /// object available.
6895 template<typename Derived>
6896 ExprResult
TransformAddressOfOperand(Expr * E)6897 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
6898 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
6899 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
6900 else
6901 return getDerived().TransformExpr(E);
6902 }
6903
6904 template<typename Derived>
6905 ExprResult
TransformUnaryOperator(UnaryOperator * E)6906 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
6907 ExprResult SubExpr;
6908 if (E->getOpcode() == UO_AddrOf)
6909 SubExpr = TransformAddressOfOperand(E->getSubExpr());
6910 else
6911 SubExpr = TransformExpr(E->getSubExpr());
6912 if (SubExpr.isInvalid())
6913 return ExprError();
6914
6915 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
6916 return E;
6917
6918 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
6919 E->getOpcode(),
6920 SubExpr.get());
6921 }
6922
6923 template<typename Derived>
6924 ExprResult
TransformOffsetOfExpr(OffsetOfExpr * E)6925 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
6926 // Transform the type.
6927 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
6928 if (!Type)
6929 return ExprError();
6930
6931 // Transform all of the components into components similar to what the
6932 // parser uses.
6933 // FIXME: It would be slightly more efficient in the non-dependent case to
6934 // just map FieldDecls, rather than requiring the rebuilder to look for
6935 // the fields again. However, __builtin_offsetof is rare enough in
6936 // template code that we don't care.
6937 bool ExprChanged = false;
6938 typedef Sema::OffsetOfComponent Component;
6939 typedef OffsetOfExpr::OffsetOfNode Node;
6940 SmallVector<Component, 4> Components;
6941 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
6942 const Node &ON = E->getComponent(I);
6943 Component Comp;
6944 Comp.isBrackets = true;
6945 Comp.LocStart = ON.getSourceRange().getBegin();
6946 Comp.LocEnd = ON.getSourceRange().getEnd();
6947 switch (ON.getKind()) {
6948 case Node::Array: {
6949 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
6950 ExprResult Index = getDerived().TransformExpr(FromIndex);
6951 if (Index.isInvalid())
6952 return ExprError();
6953
6954 ExprChanged = ExprChanged || Index.get() != FromIndex;
6955 Comp.isBrackets = true;
6956 Comp.U.E = Index.get();
6957 break;
6958 }
6959
6960 case Node::Field:
6961 case Node::Identifier:
6962 Comp.isBrackets = false;
6963 Comp.U.IdentInfo = ON.getFieldName();
6964 if (!Comp.U.IdentInfo)
6965 continue;
6966
6967 break;
6968
6969 case Node::Base:
6970 // Will be recomputed during the rebuild.
6971 continue;
6972 }
6973
6974 Components.push_back(Comp);
6975 }
6976
6977 // If nothing changed, retain the existing expression.
6978 if (!getDerived().AlwaysRebuild() &&
6979 Type == E->getTypeSourceInfo() &&
6980 !ExprChanged)
6981 return E;
6982
6983 // Build a new offsetof expression.
6984 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
6985 Components.data(), Components.size(),
6986 E->getRParenLoc());
6987 }
6988
6989 template<typename Derived>
6990 ExprResult
TransformOpaqueValueExpr(OpaqueValueExpr * E)6991 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
6992 assert(getDerived().AlreadyTransformed(E->getType()) &&
6993 "opaque value expression requires transformation");
6994 return E;
6995 }
6996
6997 template<typename Derived>
6998 ExprResult
TransformPseudoObjectExpr(PseudoObjectExpr * E)6999 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
7000 // Rebuild the syntactic form. The original syntactic form has
7001 // opaque-value expressions in it, so strip those away and rebuild
7002 // the result. This is a really awful way of doing this, but the
7003 // better solution (rebuilding the semantic expressions and
7004 // rebinding OVEs as necessary) doesn't work; we'd need
7005 // TreeTransform to not strip away implicit conversions.
7006 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
7007 ExprResult result = getDerived().TransformExpr(newSyntacticForm);
7008 if (result.isInvalid()) return ExprError();
7009
7010 // If that gives us a pseudo-object result back, the pseudo-object
7011 // expression must have been an lvalue-to-rvalue conversion which we
7012 // should reapply.
7013 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
7014 result = SemaRef.checkPseudoObjectRValue(result.get());
7015
7016 return result;
7017 }
7018
7019 template<typename Derived>
7020 ExprResult
TransformUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)7021 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
7022 UnaryExprOrTypeTraitExpr *E) {
7023 if (E->isArgumentType()) {
7024 TypeSourceInfo *OldT = E->getArgumentTypeInfo();
7025
7026 TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7027 if (!NewT)
7028 return ExprError();
7029
7030 if (!getDerived().AlwaysRebuild() && OldT == NewT)
7031 return E;
7032
7033 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
7034 E->getKind(),
7035 E->getSourceRange());
7036 }
7037
7038 // C++0x [expr.sizeof]p1:
7039 // The operand is either an expression, which is an unevaluated operand
7040 // [...]
7041 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
7042 Sema::ReuseLambdaContextDecl);
7043
7044 // Try to recover if we have something like sizeof(T::X) where X is a type.
7045 // Notably, there must be *exactly* one set of parens if X is a type.
7046 TypeSourceInfo *RecoveryTSI = nullptr;
7047 ExprResult SubExpr;
7048 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
7049 if (auto *DRE =
7050 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
7051 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
7052 PE, DRE, false, &RecoveryTSI);
7053 else
7054 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
7055
7056 if (RecoveryTSI) {
7057 return getDerived().RebuildUnaryExprOrTypeTrait(
7058 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
7059 } else if (SubExpr.isInvalid())
7060 return ExprError();
7061
7062 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
7063 return E;
7064
7065 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
7066 E->getOperatorLoc(),
7067 E->getKind(),
7068 E->getSourceRange());
7069 }
7070
7071 template<typename Derived>
7072 ExprResult
TransformArraySubscriptExpr(ArraySubscriptExpr * E)7073 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
7074 ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7075 if (LHS.isInvalid())
7076 return ExprError();
7077
7078 ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7079 if (RHS.isInvalid())
7080 return ExprError();
7081
7082
7083 if (!getDerived().AlwaysRebuild() &&
7084 LHS.get() == E->getLHS() &&
7085 RHS.get() == E->getRHS())
7086 return E;
7087
7088 return getDerived().RebuildArraySubscriptExpr(LHS.get(),
7089 /*FIXME:*/E->getLHS()->getLocStart(),
7090 RHS.get(),
7091 E->getRBracketLoc());
7092 }
7093
7094 template<typename Derived>
7095 ExprResult
TransformCallExpr(CallExpr * E)7096 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
7097 // Transform the callee.
7098 ExprResult Callee = getDerived().TransformExpr(E->getCallee());
7099 if (Callee.isInvalid())
7100 return ExprError();
7101
7102 // Transform arguments.
7103 bool ArgChanged = false;
7104 SmallVector<Expr*, 8> Args;
7105 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7106 &ArgChanged))
7107 return ExprError();
7108
7109 if (!getDerived().AlwaysRebuild() &&
7110 Callee.get() == E->getCallee() &&
7111 !ArgChanged)
7112 return SemaRef.MaybeBindToTemporary(E);
7113
7114 // FIXME: Wrong source location information for the '('.
7115 SourceLocation FakeLParenLoc
7116 = ((Expr *)Callee.get())->getSourceRange().getBegin();
7117 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
7118 Args,
7119 E->getRParenLoc());
7120 }
7121
7122 template<typename Derived>
7123 ExprResult
TransformMemberExpr(MemberExpr * E)7124 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
7125 ExprResult Base = getDerived().TransformExpr(E->getBase());
7126 if (Base.isInvalid())
7127 return ExprError();
7128
7129 NestedNameSpecifierLoc QualifierLoc;
7130 if (E->hasQualifier()) {
7131 QualifierLoc
7132 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7133
7134 if (!QualifierLoc)
7135 return ExprError();
7136 }
7137 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
7138
7139 ValueDecl *Member
7140 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
7141 E->getMemberDecl()));
7142 if (!Member)
7143 return ExprError();
7144
7145 NamedDecl *FoundDecl = E->getFoundDecl();
7146 if (FoundDecl == E->getMemberDecl()) {
7147 FoundDecl = Member;
7148 } else {
7149 FoundDecl = cast_or_null<NamedDecl>(
7150 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
7151 if (!FoundDecl)
7152 return ExprError();
7153 }
7154
7155 if (!getDerived().AlwaysRebuild() &&
7156 Base.get() == E->getBase() &&
7157 QualifierLoc == E->getQualifierLoc() &&
7158 Member == E->getMemberDecl() &&
7159 FoundDecl == E->getFoundDecl() &&
7160 !E->hasExplicitTemplateArgs()) {
7161
7162 // Mark it referenced in the new context regardless.
7163 // FIXME: this is a bit instantiation-specific.
7164 SemaRef.MarkMemberReferenced(E);
7165
7166 return E;
7167 }
7168
7169 TemplateArgumentListInfo TransArgs;
7170 if (E->hasExplicitTemplateArgs()) {
7171 TransArgs.setLAngleLoc(E->getLAngleLoc());
7172 TransArgs.setRAngleLoc(E->getRAngleLoc());
7173 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7174 E->getNumTemplateArgs(),
7175 TransArgs))
7176 return ExprError();
7177 }
7178
7179 // FIXME: Bogus source location for the operator
7180 SourceLocation FakeOperatorLoc =
7181 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
7182
7183 // FIXME: to do this check properly, we will need to preserve the
7184 // first-qualifier-in-scope here, just in case we had a dependent
7185 // base (and therefore couldn't do the check) and a
7186 // nested-name-qualifier (and therefore could do the lookup).
7187 NamedDecl *FirstQualifierInScope = nullptr;
7188
7189 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
7190 E->isArrow(),
7191 QualifierLoc,
7192 TemplateKWLoc,
7193 E->getMemberNameInfo(),
7194 Member,
7195 FoundDecl,
7196 (E->hasExplicitTemplateArgs()
7197 ? &TransArgs : nullptr),
7198 FirstQualifierInScope);
7199 }
7200
7201 template<typename Derived>
7202 ExprResult
TransformBinaryOperator(BinaryOperator * E)7203 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
7204 ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7205 if (LHS.isInvalid())
7206 return ExprError();
7207
7208 ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7209 if (RHS.isInvalid())
7210 return ExprError();
7211
7212 if (!getDerived().AlwaysRebuild() &&
7213 LHS.get() == E->getLHS() &&
7214 RHS.get() == E->getRHS())
7215 return E;
7216
7217 Sema::FPContractStateRAII FPContractState(getSema());
7218 getSema().FPFeatures.fp_contract = E->isFPContractable();
7219
7220 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
7221 LHS.get(), RHS.get());
7222 }
7223
7224 template<typename Derived>
7225 ExprResult
TransformCompoundAssignOperator(CompoundAssignOperator * E)7226 TreeTransform<Derived>::TransformCompoundAssignOperator(
7227 CompoundAssignOperator *E) {
7228 return getDerived().TransformBinaryOperator(E);
7229 }
7230
7231 template<typename Derived>
7232 ExprResult TreeTransform<Derived>::
TransformBinaryConditionalOperator(BinaryConditionalOperator * e)7233 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
7234 // Just rebuild the common and RHS expressions and see whether we
7235 // get any changes.
7236
7237 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
7238 if (commonExpr.isInvalid())
7239 return ExprError();
7240
7241 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
7242 if (rhs.isInvalid())
7243 return ExprError();
7244
7245 if (!getDerived().AlwaysRebuild() &&
7246 commonExpr.get() == e->getCommon() &&
7247 rhs.get() == e->getFalseExpr())
7248 return e;
7249
7250 return getDerived().RebuildConditionalOperator(commonExpr.get(),
7251 e->getQuestionLoc(),
7252 nullptr,
7253 e->getColonLoc(),
7254 rhs.get());
7255 }
7256
7257 template<typename Derived>
7258 ExprResult
TransformConditionalOperator(ConditionalOperator * E)7259 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
7260 ExprResult Cond = getDerived().TransformExpr(E->getCond());
7261 if (Cond.isInvalid())
7262 return ExprError();
7263
7264 ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7265 if (LHS.isInvalid())
7266 return ExprError();
7267
7268 ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7269 if (RHS.isInvalid())
7270 return ExprError();
7271
7272 if (!getDerived().AlwaysRebuild() &&
7273 Cond.get() == E->getCond() &&
7274 LHS.get() == E->getLHS() &&
7275 RHS.get() == E->getRHS())
7276 return E;
7277
7278 return getDerived().RebuildConditionalOperator(Cond.get(),
7279 E->getQuestionLoc(),
7280 LHS.get(),
7281 E->getColonLoc(),
7282 RHS.get());
7283 }
7284
7285 template<typename Derived>
7286 ExprResult
TransformImplicitCastExpr(ImplicitCastExpr * E)7287 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
7288 // Implicit casts are eliminated during transformation, since they
7289 // will be recomputed by semantic analysis after transformation.
7290 return getDerived().TransformExpr(E->getSubExprAsWritten());
7291 }
7292
7293 template<typename Derived>
7294 ExprResult
TransformCStyleCastExpr(CStyleCastExpr * E)7295 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
7296 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
7297 if (!Type)
7298 return ExprError();
7299
7300 ExprResult SubExpr
7301 = getDerived().TransformExpr(E->getSubExprAsWritten());
7302 if (SubExpr.isInvalid())
7303 return ExprError();
7304
7305 if (!getDerived().AlwaysRebuild() &&
7306 Type == E->getTypeInfoAsWritten() &&
7307 SubExpr.get() == E->getSubExpr())
7308 return E;
7309
7310 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
7311 Type,
7312 E->getRParenLoc(),
7313 SubExpr.get());
7314 }
7315
7316 template<typename Derived>
7317 ExprResult
TransformCompoundLiteralExpr(CompoundLiteralExpr * E)7318 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
7319 TypeSourceInfo *OldT = E->getTypeSourceInfo();
7320 TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7321 if (!NewT)
7322 return ExprError();
7323
7324 ExprResult Init = getDerived().TransformExpr(E->getInitializer());
7325 if (Init.isInvalid())
7326 return ExprError();
7327
7328 if (!getDerived().AlwaysRebuild() &&
7329 OldT == NewT &&
7330 Init.get() == E->getInitializer())
7331 return SemaRef.MaybeBindToTemporary(E);
7332
7333 // Note: the expression type doesn't necessarily match the
7334 // type-as-written, but that's okay, because it should always be
7335 // derivable from the initializer.
7336
7337 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
7338 /*FIXME:*/E->getInitializer()->getLocEnd(),
7339 Init.get());
7340 }
7341
7342 template<typename Derived>
7343 ExprResult
TransformExtVectorElementExpr(ExtVectorElementExpr * E)7344 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
7345 ExprResult Base = getDerived().TransformExpr(E->getBase());
7346 if (Base.isInvalid())
7347 return ExprError();
7348
7349 if (!getDerived().AlwaysRebuild() &&
7350 Base.get() == E->getBase())
7351 return E;
7352
7353 // FIXME: Bad source location
7354 SourceLocation FakeOperatorLoc =
7355 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
7356 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
7357 E->getAccessorLoc(),
7358 E->getAccessor());
7359 }
7360
7361 template<typename Derived>
7362 ExprResult
TransformInitListExpr(InitListExpr * E)7363 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
7364 bool InitChanged = false;
7365
7366 SmallVector<Expr*, 4> Inits;
7367 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
7368 Inits, &InitChanged))
7369 return ExprError();
7370
7371 if (!getDerived().AlwaysRebuild() && !InitChanged)
7372 return E;
7373
7374 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
7375 E->getRBraceLoc(), E->getType());
7376 }
7377
7378 template<typename Derived>
7379 ExprResult
TransformDesignatedInitExpr(DesignatedInitExpr * E)7380 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
7381 Designation Desig;
7382
7383 // transform the initializer value
7384 ExprResult Init = getDerived().TransformExpr(E->getInit());
7385 if (Init.isInvalid())
7386 return ExprError();
7387
7388 // transform the designators.
7389 SmallVector<Expr*, 4> ArrayExprs;
7390 bool ExprChanged = false;
7391 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
7392 DEnd = E->designators_end();
7393 D != DEnd; ++D) {
7394 if (D->isFieldDesignator()) {
7395 Desig.AddDesignator(Designator::getField(D->getFieldName(),
7396 D->getDotLoc(),
7397 D->getFieldLoc()));
7398 continue;
7399 }
7400
7401 if (D->isArrayDesignator()) {
7402 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
7403 if (Index.isInvalid())
7404 return ExprError();
7405
7406 Desig.AddDesignator(Designator::getArray(Index.get(),
7407 D->getLBracketLoc()));
7408
7409 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
7410 ArrayExprs.push_back(Index.get());
7411 continue;
7412 }
7413
7414 assert(D->isArrayRangeDesignator() && "New kind of designator?");
7415 ExprResult Start
7416 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
7417 if (Start.isInvalid())
7418 return ExprError();
7419
7420 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
7421 if (End.isInvalid())
7422 return ExprError();
7423
7424 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
7425 End.get(),
7426 D->getLBracketLoc(),
7427 D->getEllipsisLoc()));
7428
7429 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
7430 End.get() != E->getArrayRangeEnd(*D);
7431
7432 ArrayExprs.push_back(Start.get());
7433 ArrayExprs.push_back(End.get());
7434 }
7435
7436 if (!getDerived().AlwaysRebuild() &&
7437 Init.get() == E->getInit() &&
7438 !ExprChanged)
7439 return E;
7440
7441 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
7442 E->getEqualOrColonLoc(),
7443 E->usesGNUSyntax(), Init.get());
7444 }
7445
7446 template<typename Derived>
7447 ExprResult
TransformImplicitValueInitExpr(ImplicitValueInitExpr * E)7448 TreeTransform<Derived>::TransformImplicitValueInitExpr(
7449 ImplicitValueInitExpr *E) {
7450 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
7451
7452 // FIXME: Will we ever have proper type location here? Will we actually
7453 // need to transform the type?
7454 QualType T = getDerived().TransformType(E->getType());
7455 if (T.isNull())
7456 return ExprError();
7457
7458 if (!getDerived().AlwaysRebuild() &&
7459 T == E->getType())
7460 return E;
7461
7462 return getDerived().RebuildImplicitValueInitExpr(T);
7463 }
7464
7465 template<typename Derived>
7466 ExprResult
TransformVAArgExpr(VAArgExpr * E)7467 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
7468 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
7469 if (!TInfo)
7470 return ExprError();
7471
7472 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7473 if (SubExpr.isInvalid())
7474 return ExprError();
7475
7476 if (!getDerived().AlwaysRebuild() &&
7477 TInfo == E->getWrittenTypeInfo() &&
7478 SubExpr.get() == E->getSubExpr())
7479 return E;
7480
7481 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
7482 TInfo, E->getRParenLoc());
7483 }
7484
7485 template<typename Derived>
7486 ExprResult
TransformParenListExpr(ParenListExpr * E)7487 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
7488 bool ArgumentChanged = false;
7489 SmallVector<Expr*, 4> Inits;
7490 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
7491 &ArgumentChanged))
7492 return ExprError();
7493
7494 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
7495 Inits,
7496 E->getRParenLoc());
7497 }
7498
7499 /// \brief Transform an address-of-label expression.
7500 ///
7501 /// By default, the transformation of an address-of-label expression always
7502 /// rebuilds the expression, so that the label identifier can be resolved to
7503 /// the corresponding label statement by semantic analysis.
7504 template<typename Derived>
7505 ExprResult
TransformAddrLabelExpr(AddrLabelExpr * E)7506 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
7507 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
7508 E->getLabel());
7509 if (!LD)
7510 return ExprError();
7511
7512 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
7513 cast<LabelDecl>(LD));
7514 }
7515
7516 template<typename Derived>
7517 ExprResult
TransformStmtExpr(StmtExpr * E)7518 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
7519 SemaRef.ActOnStartStmtExpr();
7520 StmtResult SubStmt
7521 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
7522 if (SubStmt.isInvalid()) {
7523 SemaRef.ActOnStmtExprError();
7524 return ExprError();
7525 }
7526
7527 if (!getDerived().AlwaysRebuild() &&
7528 SubStmt.get() == E->getSubStmt()) {
7529 // Calling this an 'error' is unintuitive, but it does the right thing.
7530 SemaRef.ActOnStmtExprError();
7531 return SemaRef.MaybeBindToTemporary(E);
7532 }
7533
7534 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
7535 SubStmt.get(),
7536 E->getRParenLoc());
7537 }
7538
7539 template<typename Derived>
7540 ExprResult
TransformChooseExpr(ChooseExpr * E)7541 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
7542 ExprResult Cond = getDerived().TransformExpr(E->getCond());
7543 if (Cond.isInvalid())
7544 return ExprError();
7545
7546 ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7547 if (LHS.isInvalid())
7548 return ExprError();
7549
7550 ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7551 if (RHS.isInvalid())
7552 return ExprError();
7553
7554 if (!getDerived().AlwaysRebuild() &&
7555 Cond.get() == E->getCond() &&
7556 LHS.get() == E->getLHS() &&
7557 RHS.get() == E->getRHS())
7558 return E;
7559
7560 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
7561 Cond.get(), LHS.get(), RHS.get(),
7562 E->getRParenLoc());
7563 }
7564
7565 template<typename Derived>
7566 ExprResult
TransformGNUNullExpr(GNUNullExpr * E)7567 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
7568 return E;
7569 }
7570
7571 template<typename Derived>
7572 ExprResult
TransformCXXOperatorCallExpr(CXXOperatorCallExpr * E)7573 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
7574 switch (E->getOperator()) {
7575 case OO_New:
7576 case OO_Delete:
7577 case OO_Array_New:
7578 case OO_Array_Delete:
7579 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
7580
7581 case OO_Call: {
7582 // This is a call to an object's operator().
7583 assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
7584
7585 // Transform the object itself.
7586 ExprResult Object = getDerived().TransformExpr(E->getArg(0));
7587 if (Object.isInvalid())
7588 return ExprError();
7589
7590 // FIXME: Poor location information
7591 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
7592 static_cast<Expr *>(Object.get())->getLocEnd());
7593
7594 // Transform the call arguments.
7595 SmallVector<Expr*, 8> Args;
7596 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
7597 Args))
7598 return ExprError();
7599
7600 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
7601 Args,
7602 E->getLocEnd());
7603 }
7604
7605 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
7606 case OO_##Name:
7607 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
7608 #include "clang/Basic/OperatorKinds.def"
7609 case OO_Subscript:
7610 // Handled below.
7611 break;
7612
7613 case OO_Conditional:
7614 llvm_unreachable("conditional operator is not actually overloadable");
7615
7616 case OO_None:
7617 case NUM_OVERLOADED_OPERATORS:
7618 llvm_unreachable("not an overloaded operator?");
7619 }
7620
7621 ExprResult Callee = getDerived().TransformExpr(E->getCallee());
7622 if (Callee.isInvalid())
7623 return ExprError();
7624
7625 ExprResult First;
7626 if (E->getOperator() == OO_Amp)
7627 First = getDerived().TransformAddressOfOperand(E->getArg(0));
7628 else
7629 First = getDerived().TransformExpr(E->getArg(0));
7630 if (First.isInvalid())
7631 return ExprError();
7632
7633 ExprResult Second;
7634 if (E->getNumArgs() == 2) {
7635 Second = getDerived().TransformExpr(E->getArg(1));
7636 if (Second.isInvalid())
7637 return ExprError();
7638 }
7639
7640 if (!getDerived().AlwaysRebuild() &&
7641 Callee.get() == E->getCallee() &&
7642 First.get() == E->getArg(0) &&
7643 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
7644 return SemaRef.MaybeBindToTemporary(E);
7645
7646 Sema::FPContractStateRAII FPContractState(getSema());
7647 getSema().FPFeatures.fp_contract = E->isFPContractable();
7648
7649 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
7650 E->getOperatorLoc(),
7651 Callee.get(),
7652 First.get(),
7653 Second.get());
7654 }
7655
7656 template<typename Derived>
7657 ExprResult
TransformCXXMemberCallExpr(CXXMemberCallExpr * E)7658 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
7659 return getDerived().TransformCallExpr(E);
7660 }
7661
7662 template<typename Derived>
7663 ExprResult
TransformCUDAKernelCallExpr(CUDAKernelCallExpr * E)7664 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
7665 // Transform the callee.
7666 ExprResult Callee = getDerived().TransformExpr(E->getCallee());
7667 if (Callee.isInvalid())
7668 return ExprError();
7669
7670 // Transform exec config.
7671 ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
7672 if (EC.isInvalid())
7673 return ExprError();
7674
7675 // Transform arguments.
7676 bool ArgChanged = false;
7677 SmallVector<Expr*, 8> Args;
7678 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7679 &ArgChanged))
7680 return ExprError();
7681
7682 if (!getDerived().AlwaysRebuild() &&
7683 Callee.get() == E->getCallee() &&
7684 !ArgChanged)
7685 return SemaRef.MaybeBindToTemporary(E);
7686
7687 // FIXME: Wrong source location information for the '('.
7688 SourceLocation FakeLParenLoc
7689 = ((Expr *)Callee.get())->getSourceRange().getBegin();
7690 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
7691 Args,
7692 E->getRParenLoc(), EC.get());
7693 }
7694
7695 template<typename Derived>
7696 ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr * E)7697 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
7698 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
7699 if (!Type)
7700 return ExprError();
7701
7702 ExprResult SubExpr
7703 = getDerived().TransformExpr(E->getSubExprAsWritten());
7704 if (SubExpr.isInvalid())
7705 return ExprError();
7706
7707 if (!getDerived().AlwaysRebuild() &&
7708 Type == E->getTypeInfoAsWritten() &&
7709 SubExpr.get() == E->getSubExpr())
7710 return E;
7711 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
7712 E->getStmtClass(),
7713 E->getAngleBrackets().getBegin(),
7714 Type,
7715 E->getAngleBrackets().getEnd(),
7716 // FIXME. this should be '(' location
7717 E->getAngleBrackets().getEnd(),
7718 SubExpr.get(),
7719 E->getRParenLoc());
7720 }
7721
7722 template<typename Derived>
7723 ExprResult
TransformCXXStaticCastExpr(CXXStaticCastExpr * E)7724 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
7725 return getDerived().TransformCXXNamedCastExpr(E);
7726 }
7727
7728 template<typename Derived>
7729 ExprResult
TransformCXXDynamicCastExpr(CXXDynamicCastExpr * E)7730 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
7731 return getDerived().TransformCXXNamedCastExpr(E);
7732 }
7733
7734 template<typename Derived>
7735 ExprResult
TransformCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)7736 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
7737 CXXReinterpretCastExpr *E) {
7738 return getDerived().TransformCXXNamedCastExpr(E);
7739 }
7740
7741 template<typename Derived>
7742 ExprResult
TransformCXXConstCastExpr(CXXConstCastExpr * E)7743 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
7744 return getDerived().TransformCXXNamedCastExpr(E);
7745 }
7746
7747 template<typename Derived>
7748 ExprResult
TransformCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)7749 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
7750 CXXFunctionalCastExpr *E) {
7751 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
7752 if (!Type)
7753 return ExprError();
7754
7755 ExprResult SubExpr
7756 = getDerived().TransformExpr(E->getSubExprAsWritten());
7757 if (SubExpr.isInvalid())
7758 return ExprError();
7759
7760 if (!getDerived().AlwaysRebuild() &&
7761 Type == E->getTypeInfoAsWritten() &&
7762 SubExpr.get() == E->getSubExpr())
7763 return E;
7764
7765 return getDerived().RebuildCXXFunctionalCastExpr(Type,
7766 E->getLParenLoc(),
7767 SubExpr.get(),
7768 E->getRParenLoc());
7769 }
7770
7771 template<typename Derived>
7772 ExprResult
TransformCXXTypeidExpr(CXXTypeidExpr * E)7773 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
7774 if (E->isTypeOperand()) {
7775 TypeSourceInfo *TInfo
7776 = getDerived().TransformType(E->getTypeOperandSourceInfo());
7777 if (!TInfo)
7778 return ExprError();
7779
7780 if (!getDerived().AlwaysRebuild() &&
7781 TInfo == E->getTypeOperandSourceInfo())
7782 return E;
7783
7784 return getDerived().RebuildCXXTypeidExpr(E->getType(),
7785 E->getLocStart(),
7786 TInfo,
7787 E->getLocEnd());
7788 }
7789
7790 // We don't know whether the subexpression is potentially evaluated until
7791 // after we perform semantic analysis. We speculatively assume it is
7792 // unevaluated; it will get fixed later if the subexpression is in fact
7793 // potentially evaluated.
7794 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
7795 Sema::ReuseLambdaContextDecl);
7796
7797 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
7798 if (SubExpr.isInvalid())
7799 return ExprError();
7800
7801 if (!getDerived().AlwaysRebuild() &&
7802 SubExpr.get() == E->getExprOperand())
7803 return E;
7804
7805 return getDerived().RebuildCXXTypeidExpr(E->getType(),
7806 E->getLocStart(),
7807 SubExpr.get(),
7808 E->getLocEnd());
7809 }
7810
7811 template<typename Derived>
7812 ExprResult
TransformCXXUuidofExpr(CXXUuidofExpr * E)7813 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
7814 if (E->isTypeOperand()) {
7815 TypeSourceInfo *TInfo
7816 = getDerived().TransformType(E->getTypeOperandSourceInfo());
7817 if (!TInfo)
7818 return ExprError();
7819
7820 if (!getDerived().AlwaysRebuild() &&
7821 TInfo == E->getTypeOperandSourceInfo())
7822 return E;
7823
7824 return getDerived().RebuildCXXUuidofExpr(E->getType(),
7825 E->getLocStart(),
7826 TInfo,
7827 E->getLocEnd());
7828 }
7829
7830 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
7831
7832 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
7833 if (SubExpr.isInvalid())
7834 return ExprError();
7835
7836 if (!getDerived().AlwaysRebuild() &&
7837 SubExpr.get() == E->getExprOperand())
7838 return E;
7839
7840 return getDerived().RebuildCXXUuidofExpr(E->getType(),
7841 E->getLocStart(),
7842 SubExpr.get(),
7843 E->getLocEnd());
7844 }
7845
7846 template<typename Derived>
7847 ExprResult
TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)7848 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
7849 return E;
7850 }
7851
7852 template<typename Derived>
7853 ExprResult
TransformCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)7854 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
7855 CXXNullPtrLiteralExpr *E) {
7856 return E;
7857 }
7858
7859 template<typename Derived>
7860 ExprResult
TransformCXXThisExpr(CXXThisExpr * E)7861 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
7862 QualType T = getSema().getCurrentThisType();
7863
7864 if (!getDerived().AlwaysRebuild() && T == E->getType()) {
7865 // Make sure that we capture 'this'.
7866 getSema().CheckCXXThisCapture(E->getLocStart());
7867 return E;
7868 }
7869
7870 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
7871 }
7872
7873 template<typename Derived>
7874 ExprResult
TransformCXXThrowExpr(CXXThrowExpr * E)7875 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
7876 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7877 if (SubExpr.isInvalid())
7878 return ExprError();
7879
7880 if (!getDerived().AlwaysRebuild() &&
7881 SubExpr.get() == E->getSubExpr())
7882 return E;
7883
7884 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
7885 E->isThrownVariableInScope());
7886 }
7887
7888 template<typename Derived>
7889 ExprResult
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)7890 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
7891 ParmVarDecl *Param
7892 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
7893 E->getParam()));
7894 if (!Param)
7895 return ExprError();
7896
7897 if (!getDerived().AlwaysRebuild() &&
7898 Param == E->getParam())
7899 return E;
7900
7901 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
7902 }
7903
7904 template<typename Derived>
7905 ExprResult
TransformCXXDefaultInitExpr(CXXDefaultInitExpr * E)7906 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
7907 FieldDecl *Field
7908 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
7909 E->getField()));
7910 if (!Field)
7911 return ExprError();
7912
7913 if (!getDerived().AlwaysRebuild() && Field == E->getField())
7914 return E;
7915
7916 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
7917 }
7918
7919 template<typename Derived>
7920 ExprResult
TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)7921 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
7922 CXXScalarValueInitExpr *E) {
7923 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
7924 if (!T)
7925 return ExprError();
7926
7927 if (!getDerived().AlwaysRebuild() &&
7928 T == E->getTypeSourceInfo())
7929 return E;
7930
7931 return getDerived().RebuildCXXScalarValueInitExpr(T,
7932 /*FIXME:*/T->getTypeLoc().getEndLoc(),
7933 E->getRParenLoc());
7934 }
7935
7936 template<typename Derived>
7937 ExprResult
TransformCXXNewExpr(CXXNewExpr * E)7938 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
7939 // Transform the type that we're allocating
7940 TypeSourceInfo *AllocTypeInfo
7941 = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
7942 if (!AllocTypeInfo)
7943 return ExprError();
7944
7945 // Transform the size of the array we're allocating (if any).
7946 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
7947 if (ArraySize.isInvalid())
7948 return ExprError();
7949
7950 // Transform the placement arguments (if any).
7951 bool ArgumentChanged = false;
7952 SmallVector<Expr*, 8> PlacementArgs;
7953 if (getDerived().TransformExprs(E->getPlacementArgs(),
7954 E->getNumPlacementArgs(), true,
7955 PlacementArgs, &ArgumentChanged))
7956 return ExprError();
7957
7958 // Transform the initializer (if any).
7959 Expr *OldInit = E->getInitializer();
7960 ExprResult NewInit;
7961 if (OldInit)
7962 NewInit = getDerived().TransformExpr(OldInit);
7963 if (NewInit.isInvalid())
7964 return ExprError();
7965
7966 // Transform new operator and delete operator.
7967 FunctionDecl *OperatorNew = nullptr;
7968 if (E->getOperatorNew()) {
7969 OperatorNew = cast_or_null<FunctionDecl>(
7970 getDerived().TransformDecl(E->getLocStart(),
7971 E->getOperatorNew()));
7972 if (!OperatorNew)
7973 return ExprError();
7974 }
7975
7976 FunctionDecl *OperatorDelete = nullptr;
7977 if (E->getOperatorDelete()) {
7978 OperatorDelete = cast_or_null<FunctionDecl>(
7979 getDerived().TransformDecl(E->getLocStart(),
7980 E->getOperatorDelete()));
7981 if (!OperatorDelete)
7982 return ExprError();
7983 }
7984
7985 if (!getDerived().AlwaysRebuild() &&
7986 AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
7987 ArraySize.get() == E->getArraySize() &&
7988 NewInit.get() == OldInit &&
7989 OperatorNew == E->getOperatorNew() &&
7990 OperatorDelete == E->getOperatorDelete() &&
7991 !ArgumentChanged) {
7992 // Mark any declarations we need as referenced.
7993 // FIXME: instantiation-specific.
7994 if (OperatorNew)
7995 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
7996 if (OperatorDelete)
7997 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
7998
7999 if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
8000 QualType ElementType
8001 = SemaRef.Context.getBaseElementType(E->getAllocatedType());
8002 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
8003 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
8004 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
8005 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
8006 }
8007 }
8008 }
8009
8010 return E;
8011 }
8012
8013 QualType AllocType = AllocTypeInfo->getType();
8014 if (!ArraySize.get()) {
8015 // If no array size was specified, but the new expression was
8016 // instantiated with an array type (e.g., "new T" where T is
8017 // instantiated with "int[4]"), extract the outer bound from the
8018 // array type as our array size. We do this with constant and
8019 // dependently-sized array types.
8020 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
8021 if (!ArrayT) {
8022 // Do nothing
8023 } else if (const ConstantArrayType *ConsArrayT
8024 = dyn_cast<ConstantArrayType>(ArrayT)) {
8025 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
8026 SemaRef.Context.getSizeType(),
8027 /*FIXME:*/ E->getLocStart());
8028 AllocType = ConsArrayT->getElementType();
8029 } else if (const DependentSizedArrayType *DepArrayT
8030 = dyn_cast<DependentSizedArrayType>(ArrayT)) {
8031 if (DepArrayT->getSizeExpr()) {
8032 ArraySize = DepArrayT->getSizeExpr();
8033 AllocType = DepArrayT->getElementType();
8034 }
8035 }
8036 }
8037
8038 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
8039 E->isGlobalNew(),
8040 /*FIXME:*/E->getLocStart(),
8041 PlacementArgs,
8042 /*FIXME:*/E->getLocStart(),
8043 E->getTypeIdParens(),
8044 AllocType,
8045 AllocTypeInfo,
8046 ArraySize.get(),
8047 E->getDirectInitRange(),
8048 NewInit.get());
8049 }
8050
8051 template<typename Derived>
8052 ExprResult
TransformCXXDeleteExpr(CXXDeleteExpr * E)8053 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
8054 ExprResult Operand = getDerived().TransformExpr(E->getArgument());
8055 if (Operand.isInvalid())
8056 return ExprError();
8057
8058 // Transform the delete operator, if known.
8059 FunctionDecl *OperatorDelete = nullptr;
8060 if (E->getOperatorDelete()) {
8061 OperatorDelete = cast_or_null<FunctionDecl>(
8062 getDerived().TransformDecl(E->getLocStart(),
8063 E->getOperatorDelete()));
8064 if (!OperatorDelete)
8065 return ExprError();
8066 }
8067
8068 if (!getDerived().AlwaysRebuild() &&
8069 Operand.get() == E->getArgument() &&
8070 OperatorDelete == E->getOperatorDelete()) {
8071 // Mark any declarations we need as referenced.
8072 // FIXME: instantiation-specific.
8073 if (OperatorDelete)
8074 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8075
8076 if (!E->getArgument()->isTypeDependent()) {
8077 QualType Destroyed = SemaRef.Context.getBaseElementType(
8078 E->getDestroyedType());
8079 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
8080 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
8081 SemaRef.MarkFunctionReferenced(E->getLocStart(),
8082 SemaRef.LookupDestructor(Record));
8083 }
8084 }
8085
8086 return E;
8087 }
8088
8089 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
8090 E->isGlobalDelete(),
8091 E->isArrayForm(),
8092 Operand.get());
8093 }
8094
8095 template<typename Derived>
8096 ExprResult
TransformCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)8097 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
8098 CXXPseudoDestructorExpr *E) {
8099 ExprResult Base = getDerived().TransformExpr(E->getBase());
8100 if (Base.isInvalid())
8101 return ExprError();
8102
8103 ParsedType ObjectTypePtr;
8104 bool MayBePseudoDestructor = false;
8105 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
8106 E->getOperatorLoc(),
8107 E->isArrow()? tok::arrow : tok::period,
8108 ObjectTypePtr,
8109 MayBePseudoDestructor);
8110 if (Base.isInvalid())
8111 return ExprError();
8112
8113 QualType ObjectType = ObjectTypePtr.get();
8114 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
8115 if (QualifierLoc) {
8116 QualifierLoc
8117 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
8118 if (!QualifierLoc)
8119 return ExprError();
8120 }
8121 CXXScopeSpec SS;
8122 SS.Adopt(QualifierLoc);
8123
8124 PseudoDestructorTypeStorage Destroyed;
8125 if (E->getDestroyedTypeInfo()) {
8126 TypeSourceInfo *DestroyedTypeInfo
8127 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
8128 ObjectType, nullptr, SS);
8129 if (!DestroyedTypeInfo)
8130 return ExprError();
8131 Destroyed = DestroyedTypeInfo;
8132 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
8133 // We aren't likely to be able to resolve the identifier down to a type
8134 // now anyway, so just retain the identifier.
8135 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
8136 E->getDestroyedTypeLoc());
8137 } else {
8138 // Look for a destructor known with the given name.
8139 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
8140 *E->getDestroyedTypeIdentifier(),
8141 E->getDestroyedTypeLoc(),
8142 /*Scope=*/nullptr,
8143 SS, ObjectTypePtr,
8144 false);
8145 if (!T)
8146 return ExprError();
8147
8148 Destroyed
8149 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
8150 E->getDestroyedTypeLoc());
8151 }
8152
8153 TypeSourceInfo *ScopeTypeInfo = nullptr;
8154 if (E->getScopeTypeInfo()) {
8155 CXXScopeSpec EmptySS;
8156 ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
8157 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
8158 if (!ScopeTypeInfo)
8159 return ExprError();
8160 }
8161
8162 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
8163 E->getOperatorLoc(),
8164 E->isArrow(),
8165 SS,
8166 ScopeTypeInfo,
8167 E->getColonColonLoc(),
8168 E->getTildeLoc(),
8169 Destroyed);
8170 }
8171
8172 template<typename Derived>
8173 ExprResult
TransformUnresolvedLookupExpr(UnresolvedLookupExpr * Old)8174 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
8175 UnresolvedLookupExpr *Old) {
8176 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
8177 Sema::LookupOrdinaryName);
8178
8179 // Transform all the decls.
8180 for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
8181 E = Old->decls_end(); I != E; ++I) {
8182 NamedDecl *InstD = static_cast<NamedDecl*>(
8183 getDerived().TransformDecl(Old->getNameLoc(),
8184 *I));
8185 if (!InstD) {
8186 // Silently ignore these if a UsingShadowDecl instantiated to nothing.
8187 // This can happen because of dependent hiding.
8188 if (isa<UsingShadowDecl>(*I))
8189 continue;
8190 else {
8191 R.clear();
8192 return ExprError();
8193 }
8194 }
8195
8196 // Expand using declarations.
8197 if (isa<UsingDecl>(InstD)) {
8198 UsingDecl *UD = cast<UsingDecl>(InstD);
8199 for (auto *I : UD->shadows())
8200 R.addDecl(I);
8201 continue;
8202 }
8203
8204 R.addDecl(InstD);
8205 }
8206
8207 // Resolve a kind, but don't do any further analysis. If it's
8208 // ambiguous, the callee needs to deal with it.
8209 R.resolveKind();
8210
8211 // Rebuild the nested-name qualifier, if present.
8212 CXXScopeSpec SS;
8213 if (Old->getQualifierLoc()) {
8214 NestedNameSpecifierLoc QualifierLoc
8215 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
8216 if (!QualifierLoc)
8217 return ExprError();
8218
8219 SS.Adopt(QualifierLoc);
8220 }
8221
8222 if (Old->getNamingClass()) {
8223 CXXRecordDecl *NamingClass
8224 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
8225 Old->getNameLoc(),
8226 Old->getNamingClass()));
8227 if (!NamingClass) {
8228 R.clear();
8229 return ExprError();
8230 }
8231
8232 R.setNamingClass(NamingClass);
8233 }
8234
8235 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
8236
8237 // If we have neither explicit template arguments, nor the template keyword,
8238 // it's a normal declaration name.
8239 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
8240 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
8241
8242 // If we have template arguments, rebuild them, then rebuild the
8243 // templateid expression.
8244 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
8245 if (Old->hasExplicitTemplateArgs() &&
8246 getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
8247 Old->getNumTemplateArgs(),
8248 TransArgs)) {
8249 R.clear();
8250 return ExprError();
8251 }
8252
8253 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
8254 Old->requiresADL(), &TransArgs);
8255 }
8256
8257 template<typename Derived>
8258 ExprResult
TransformTypeTraitExpr(TypeTraitExpr * E)8259 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
8260 bool ArgChanged = false;
8261 SmallVector<TypeSourceInfo *, 4> Args;
8262 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
8263 TypeSourceInfo *From = E->getArg(I);
8264 TypeLoc FromTL = From->getTypeLoc();
8265 if (!FromTL.getAs<PackExpansionTypeLoc>()) {
8266 TypeLocBuilder TLB;
8267 TLB.reserve(FromTL.getFullDataSize());
8268 QualType To = getDerived().TransformType(TLB, FromTL);
8269 if (To.isNull())
8270 return ExprError();
8271
8272 if (To == From->getType())
8273 Args.push_back(From);
8274 else {
8275 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8276 ArgChanged = true;
8277 }
8278 continue;
8279 }
8280
8281 ArgChanged = true;
8282
8283 // We have a pack expansion. Instantiate it.
8284 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
8285 TypeLoc PatternTL = ExpansionTL.getPatternLoc();
8286 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
8287 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
8288
8289 // Determine whether the set of unexpanded parameter packs can and should
8290 // be expanded.
8291 bool Expand = true;
8292 bool RetainExpansion = false;
8293 Optional<unsigned> OrigNumExpansions =
8294 ExpansionTL.getTypePtr()->getNumExpansions();
8295 Optional<unsigned> NumExpansions = OrigNumExpansions;
8296 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
8297 PatternTL.getSourceRange(),
8298 Unexpanded,
8299 Expand, RetainExpansion,
8300 NumExpansions))
8301 return ExprError();
8302
8303 if (!Expand) {
8304 // The transform has determined that we should perform a simple
8305 // transformation on the pack expansion, producing another pack
8306 // expansion.
8307 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
8308
8309 TypeLocBuilder TLB;
8310 TLB.reserve(From->getTypeLoc().getFullDataSize());
8311
8312 QualType To = getDerived().TransformType(TLB, PatternTL);
8313 if (To.isNull())
8314 return ExprError();
8315
8316 To = getDerived().RebuildPackExpansionType(To,
8317 PatternTL.getSourceRange(),
8318 ExpansionTL.getEllipsisLoc(),
8319 NumExpansions);
8320 if (To.isNull())
8321 return ExprError();
8322
8323 PackExpansionTypeLoc ToExpansionTL
8324 = TLB.push<PackExpansionTypeLoc>(To);
8325 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8326 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8327 continue;
8328 }
8329
8330 // Expand the pack expansion by substituting for each argument in the
8331 // pack(s).
8332 for (unsigned I = 0; I != *NumExpansions; ++I) {
8333 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
8334 TypeLocBuilder TLB;
8335 TLB.reserve(PatternTL.getFullDataSize());
8336 QualType To = getDerived().TransformType(TLB, PatternTL);
8337 if (To.isNull())
8338 return ExprError();
8339
8340 if (To->containsUnexpandedParameterPack()) {
8341 To = getDerived().RebuildPackExpansionType(To,
8342 PatternTL.getSourceRange(),
8343 ExpansionTL.getEllipsisLoc(),
8344 NumExpansions);
8345 if (To.isNull())
8346 return ExprError();
8347
8348 PackExpansionTypeLoc ToExpansionTL
8349 = TLB.push<PackExpansionTypeLoc>(To);
8350 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8351 }
8352
8353 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8354 }
8355
8356 if (!RetainExpansion)
8357 continue;
8358
8359 // If we're supposed to retain a pack expansion, do so by temporarily
8360 // forgetting the partially-substituted parameter pack.
8361 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
8362
8363 TypeLocBuilder TLB;
8364 TLB.reserve(From->getTypeLoc().getFullDataSize());
8365
8366 QualType To = getDerived().TransformType(TLB, PatternTL);
8367 if (To.isNull())
8368 return ExprError();
8369
8370 To = getDerived().RebuildPackExpansionType(To,
8371 PatternTL.getSourceRange(),
8372 ExpansionTL.getEllipsisLoc(),
8373 NumExpansions);
8374 if (To.isNull())
8375 return ExprError();
8376
8377 PackExpansionTypeLoc ToExpansionTL
8378 = TLB.push<PackExpansionTypeLoc>(To);
8379 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8380 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8381 }
8382
8383 if (!getDerived().AlwaysRebuild() && !ArgChanged)
8384 return E;
8385
8386 return getDerived().RebuildTypeTrait(E->getTrait(),
8387 E->getLocStart(),
8388 Args,
8389 E->getLocEnd());
8390 }
8391
8392 template<typename Derived>
8393 ExprResult
TransformArrayTypeTraitExpr(ArrayTypeTraitExpr * E)8394 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
8395 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
8396 if (!T)
8397 return ExprError();
8398
8399 if (!getDerived().AlwaysRebuild() &&
8400 T == E->getQueriedTypeSourceInfo())
8401 return E;
8402
8403 ExprResult SubExpr;
8404 {
8405 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8406 SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
8407 if (SubExpr.isInvalid())
8408 return ExprError();
8409
8410 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
8411 return E;
8412 }
8413
8414 return getDerived().RebuildArrayTypeTrait(E->getTrait(),
8415 E->getLocStart(),
8416 T,
8417 SubExpr.get(),
8418 E->getLocEnd());
8419 }
8420
8421 template<typename Derived>
8422 ExprResult
TransformExpressionTraitExpr(ExpressionTraitExpr * E)8423 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
8424 ExprResult SubExpr;
8425 {
8426 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8427 SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
8428 if (SubExpr.isInvalid())
8429 return ExprError();
8430
8431 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
8432 return E;
8433 }
8434
8435 return getDerived().RebuildExpressionTrait(
8436 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
8437 }
8438
8439 template <typename Derived>
TransformParenDependentScopeDeclRefExpr(ParenExpr * PE,DependentScopeDeclRefExpr * DRE,bool AddrTaken,TypeSourceInfo ** RecoveryTSI)8440 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
8441 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
8442 TypeSourceInfo **RecoveryTSI) {
8443 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
8444 DRE, AddrTaken, RecoveryTSI);
8445
8446 // Propagate both errors and recovered types, which return ExprEmpty.
8447 if (!NewDRE.isUsable())
8448 return NewDRE;
8449
8450 // We got an expr, wrap it up in parens.
8451 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
8452 return PE;
8453 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
8454 PE->getRParen());
8455 }
8456
8457 template <typename Derived>
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)8458 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8459 DependentScopeDeclRefExpr *E) {
8460 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
8461 nullptr);
8462 }
8463
8464 template<typename Derived>
8465 ExprResult
TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E,bool IsAddressOfOperand,TypeSourceInfo ** RecoveryTSI)8466 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8467 DependentScopeDeclRefExpr *E,
8468 bool IsAddressOfOperand,
8469 TypeSourceInfo **RecoveryTSI) {
8470 assert(E->getQualifierLoc());
8471 NestedNameSpecifierLoc QualifierLoc
8472 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8473 if (!QualifierLoc)
8474 return ExprError();
8475 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8476
8477 // TODO: If this is a conversion-function-id, verify that the
8478 // destination type name (if present) resolves the same way after
8479 // instantiation as it did in the local scope.
8480
8481 DeclarationNameInfo NameInfo
8482 = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
8483 if (!NameInfo.getName())
8484 return ExprError();
8485
8486 if (!E->hasExplicitTemplateArgs()) {
8487 if (!getDerived().AlwaysRebuild() &&
8488 QualifierLoc == E->getQualifierLoc() &&
8489 // Note: it is sufficient to compare the Name component of NameInfo:
8490 // if name has not changed, DNLoc has not changed either.
8491 NameInfo.getName() == E->getDeclName())
8492 return E;
8493
8494 return getDerived().RebuildDependentScopeDeclRefExpr(
8495 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
8496 IsAddressOfOperand, RecoveryTSI);
8497 }
8498
8499 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
8500 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8501 E->getNumTemplateArgs(),
8502 TransArgs))
8503 return ExprError();
8504
8505 return getDerived().RebuildDependentScopeDeclRefExpr(
8506 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
8507 RecoveryTSI);
8508 }
8509
8510 template<typename Derived>
8511 ExprResult
TransformCXXConstructExpr(CXXConstructExpr * E)8512 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
8513 // CXXConstructExprs other than for list-initialization and
8514 // CXXTemporaryObjectExpr are always implicit, so when we have
8515 // a 1-argument construction we just transform that argument.
8516 if ((E->getNumArgs() == 1 ||
8517 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
8518 (!getDerived().DropCallArgument(E->getArg(0))) &&
8519 !E->isListInitialization())
8520 return getDerived().TransformExpr(E->getArg(0));
8521
8522 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
8523
8524 QualType T = getDerived().TransformType(E->getType());
8525 if (T.isNull())
8526 return ExprError();
8527
8528 CXXConstructorDecl *Constructor
8529 = cast_or_null<CXXConstructorDecl>(
8530 getDerived().TransformDecl(E->getLocStart(),
8531 E->getConstructor()));
8532 if (!Constructor)
8533 return ExprError();
8534
8535 bool ArgumentChanged = false;
8536 SmallVector<Expr*, 8> Args;
8537 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8538 &ArgumentChanged))
8539 return ExprError();
8540
8541 if (!getDerived().AlwaysRebuild() &&
8542 T == E->getType() &&
8543 Constructor == E->getConstructor() &&
8544 !ArgumentChanged) {
8545 // Mark the constructor as referenced.
8546 // FIXME: Instantiation-specific
8547 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
8548 return E;
8549 }
8550
8551 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
8552 Constructor, E->isElidable(),
8553 Args,
8554 E->hadMultipleCandidates(),
8555 E->isListInitialization(),
8556 E->requiresZeroInitialization(),
8557 E->getConstructionKind(),
8558 E->getParenOrBraceRange());
8559 }
8560
8561 /// \brief Transform a C++ temporary-binding expression.
8562 ///
8563 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
8564 /// transform the subexpression and return that.
8565 template<typename Derived>
8566 ExprResult
TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)8567 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
8568 return getDerived().TransformExpr(E->getSubExpr());
8569 }
8570
8571 /// \brief Transform a C++ expression that contains cleanups that should
8572 /// be run after the expression is evaluated.
8573 ///
8574 /// Since ExprWithCleanups nodes are implicitly generated, we
8575 /// just transform the subexpression and return that.
8576 template<typename Derived>
8577 ExprResult
TransformExprWithCleanups(ExprWithCleanups * E)8578 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
8579 return getDerived().TransformExpr(E->getSubExpr());
8580 }
8581
8582 template<typename Derived>
8583 ExprResult
TransformCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)8584 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
8585 CXXTemporaryObjectExpr *E) {
8586 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
8587 if (!T)
8588 return ExprError();
8589
8590 CXXConstructorDecl *Constructor
8591 = cast_or_null<CXXConstructorDecl>(
8592 getDerived().TransformDecl(E->getLocStart(),
8593 E->getConstructor()));
8594 if (!Constructor)
8595 return ExprError();
8596
8597 bool ArgumentChanged = false;
8598 SmallVector<Expr*, 8> Args;
8599 Args.reserve(E->getNumArgs());
8600 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8601 &ArgumentChanged))
8602 return ExprError();
8603
8604 if (!getDerived().AlwaysRebuild() &&
8605 T == E->getTypeSourceInfo() &&
8606 Constructor == E->getConstructor() &&
8607 !ArgumentChanged) {
8608 // FIXME: Instantiation-specific
8609 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
8610 return SemaRef.MaybeBindToTemporary(E);
8611 }
8612
8613 // FIXME: Pass in E->isListInitialization().
8614 return getDerived().RebuildCXXTemporaryObjectExpr(T,
8615 /*FIXME:*/T->getTypeLoc().getEndLoc(),
8616 Args,
8617 E->getLocEnd());
8618 }
8619
8620 template<typename Derived>
8621 ExprResult
TransformLambdaExpr(LambdaExpr * E)8622 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
8623
8624 // Transform any init-capture expressions before entering the scope of the
8625 // lambda body, because they are not semantically within that scope.
8626 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
8627 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
8628 E->explicit_capture_begin());
8629
8630 for (LambdaExpr::capture_iterator C = E->capture_begin(),
8631 CEnd = E->capture_end();
8632 C != CEnd; ++C) {
8633 if (!C->isInitCapture())
8634 continue;
8635 EnterExpressionEvaluationContext EEEC(getSema(),
8636 Sema::PotentiallyEvaluated);
8637 ExprResult NewExprInitResult = getDerived().TransformInitializer(
8638 C->getCapturedVar()->getInit(),
8639 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
8640
8641 if (NewExprInitResult.isInvalid())
8642 return ExprError();
8643 Expr *NewExprInit = NewExprInitResult.get();
8644
8645 VarDecl *OldVD = C->getCapturedVar();
8646 QualType NewInitCaptureType =
8647 getSema().performLambdaInitCaptureInitialization(C->getLocation(),
8648 OldVD->getType()->isReferenceType(), OldVD->getIdentifier(),
8649 NewExprInit);
8650 NewExprInitResult = NewExprInit;
8651 InitCaptureExprsAndTypes[C - E->capture_begin()] =
8652 std::make_pair(NewExprInitResult, NewInitCaptureType);
8653
8654 }
8655
8656 LambdaScopeInfo *LSI = getSema().PushLambdaScope();
8657 // Transform the template parameters, and add them to the current
8658 // instantiation scope. The null case is handled correctly.
8659 LSI->GLTemplateParameterList = getDerived().TransformTemplateParameterList(
8660 E->getTemplateParameterList());
8661
8662 // Check to see if the TypeSourceInfo of the call operator needs to
8663 // be transformed, and if so do the transformation in the
8664 // CurrentInstantiationScope.
8665
8666 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
8667 FunctionProtoTypeLoc OldCallOpFPTL =
8668 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
8669 TypeSourceInfo *NewCallOpTSI = nullptr;
8670
8671 const bool CallOpWasAlreadyTransformed =
8672 getDerived().AlreadyTransformed(OldCallOpTSI->getType());
8673
8674 // Use the Old Call Operator's TypeSourceInfo if it is already transformed.
8675 if (CallOpWasAlreadyTransformed)
8676 NewCallOpTSI = OldCallOpTSI;
8677 else {
8678 // Transform the TypeSourceInfo of the Original Lambda's Call Operator.
8679 // The transformation MUST be done in the CurrentInstantiationScope since
8680 // it introduces a mapping of the original to the newly created
8681 // transformed parameters.
8682
8683 TypeLocBuilder NewCallOpTLBuilder;
8684 QualType NewCallOpType = TransformFunctionProtoType(NewCallOpTLBuilder,
8685 OldCallOpFPTL,
8686 nullptr, 0);
8687 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
8688 NewCallOpType);
8689 }
8690 // Extract the ParmVarDecls from the NewCallOpTSI and add them to
8691 // the vector below - this will be used to synthesize the
8692 // NewCallOperator. Additionally, add the parameters of the untransformed
8693 // lambda call operator to the CurrentInstantiationScope.
8694 SmallVector<ParmVarDecl *, 4> Params;
8695 {
8696 FunctionProtoTypeLoc NewCallOpFPTL =
8697 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>();
8698 ParmVarDecl **NewParamDeclArray = NewCallOpFPTL.getParmArray();
8699 const unsigned NewNumArgs = NewCallOpFPTL.getNumParams();
8700
8701 for (unsigned I = 0; I < NewNumArgs; ++I) {
8702 // If this call operator's type does not require transformation,
8703 // the parameters do not get added to the current instantiation scope,
8704 // - so ADD them! This allows the following to compile when the enclosing
8705 // template is specialized and the entire lambda expression has to be
8706 // transformed.
8707 // template<class T> void foo(T t) {
8708 // auto L = [](auto a) {
8709 // auto M = [](char b) { <-- note: non-generic lambda
8710 // auto N = [](auto c) {
8711 // int x = sizeof(a);
8712 // x = sizeof(b); <-- specifically this line
8713 // x = sizeof(c);
8714 // };
8715 // };
8716 // };
8717 // }
8718 // foo('a')
8719 if (CallOpWasAlreadyTransformed)
8720 getDerived().transformedLocalDecl(NewParamDeclArray[I],
8721 NewParamDeclArray[I]);
8722 // Add to Params array, so these parameters can be used to create
8723 // the newly transformed call operator.
8724 Params.push_back(NewParamDeclArray[I]);
8725 }
8726 }
8727
8728 if (!NewCallOpTSI)
8729 return ExprError();
8730
8731 // Create the local class that will describe the lambda.
8732 CXXRecordDecl *Class
8733 = getSema().createLambdaClosureType(E->getIntroducerRange(),
8734 NewCallOpTSI,
8735 /*KnownDependent=*/false,
8736 E->getCaptureDefault());
8737
8738 getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
8739
8740 // Build the call operator.
8741 CXXMethodDecl *NewCallOperator
8742 = getSema().startLambdaDefinition(Class, E->getIntroducerRange(),
8743 NewCallOpTSI,
8744 E->getCallOperator()->getLocEnd(),
8745 Params);
8746 LSI->CallOperator = NewCallOperator;
8747
8748 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
8749
8750 return getDerived().TransformLambdaScope(E, NewCallOperator,
8751 InitCaptureExprsAndTypes);
8752 }
8753
8754 template<typename Derived>
8755 ExprResult
TransformLambdaScope(LambdaExpr * E,CXXMethodDecl * CallOperator,ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes)8756 TreeTransform<Derived>::TransformLambdaScope(LambdaExpr *E,
8757 CXXMethodDecl *CallOperator,
8758 ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes) {
8759 bool Invalid = false;
8760
8761 // Introduce the context of the call operator.
8762 Sema::ContextRAII SavedContext(getSema(), CallOperator,
8763 /*NewThisContext*/false);
8764
8765 LambdaScopeInfo *const LSI = getSema().getCurLambda();
8766 // Enter the scope of the lambda.
8767 getSema().buildLambdaScope(LSI, CallOperator, E->getIntroducerRange(),
8768 E->getCaptureDefault(),
8769 E->getCaptureDefaultLoc(),
8770 E->hasExplicitParameters(),
8771 E->hasExplicitResultType(),
8772 E->isMutable());
8773
8774 // Transform captures.
8775 bool FinishedExplicitCaptures = false;
8776 for (LambdaExpr::capture_iterator C = E->capture_begin(),
8777 CEnd = E->capture_end();
8778 C != CEnd; ++C) {
8779 // When we hit the first implicit capture, tell Sema that we've finished
8780 // the list of explicit captures.
8781 if (!FinishedExplicitCaptures && C->isImplicit()) {
8782 getSema().finishLambdaExplicitCaptures(LSI);
8783 FinishedExplicitCaptures = true;
8784 }
8785
8786 // Capturing 'this' is trivial.
8787 if (C->capturesThis()) {
8788 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit());
8789 continue;
8790 }
8791
8792 // Rebuild init-captures, including the implied field declaration.
8793 if (C->isInitCapture()) {
8794
8795 InitCaptureInfoTy InitExprTypePair =
8796 InitCaptureExprsAndTypes[C - E->capture_begin()];
8797 ExprResult Init = InitExprTypePair.first;
8798 QualType InitQualType = InitExprTypePair.second;
8799 if (Init.isInvalid() || InitQualType.isNull()) {
8800 Invalid = true;
8801 continue;
8802 }
8803 VarDecl *OldVD = C->getCapturedVar();
8804 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
8805 OldVD->getLocation(), InitExprTypePair.second,
8806 OldVD->getIdentifier(), Init.get());
8807 if (!NewVD)
8808 Invalid = true;
8809 else {
8810 getDerived().transformedLocalDecl(OldVD, NewVD);
8811 }
8812 getSema().buildInitCaptureField(LSI, NewVD);
8813 continue;
8814 }
8815
8816 assert(C->capturesVariable() && "unexpected kind of lambda capture");
8817
8818 // Determine the capture kind for Sema.
8819 Sema::TryCaptureKind Kind
8820 = C->isImplicit()? Sema::TryCapture_Implicit
8821 : C->getCaptureKind() == LCK_ByCopy
8822 ? Sema::TryCapture_ExplicitByVal
8823 : Sema::TryCapture_ExplicitByRef;
8824 SourceLocation EllipsisLoc;
8825 if (C->isPackExpansion()) {
8826 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
8827 bool ShouldExpand = false;
8828 bool RetainExpansion = false;
8829 Optional<unsigned> NumExpansions;
8830 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
8831 C->getLocation(),
8832 Unexpanded,
8833 ShouldExpand, RetainExpansion,
8834 NumExpansions)) {
8835 Invalid = true;
8836 continue;
8837 }
8838
8839 if (ShouldExpand) {
8840 // The transform has determined that we should perform an expansion;
8841 // transform and capture each of the arguments.
8842 // expansion of the pattern. Do so.
8843 VarDecl *Pack = C->getCapturedVar();
8844 for (unsigned I = 0; I != *NumExpansions; ++I) {
8845 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
8846 VarDecl *CapturedVar
8847 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
8848 Pack));
8849 if (!CapturedVar) {
8850 Invalid = true;
8851 continue;
8852 }
8853
8854 // Capture the transformed variable.
8855 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
8856 }
8857
8858 // FIXME: Retain a pack expansion if RetainExpansion is true.
8859
8860 continue;
8861 }
8862
8863 EllipsisLoc = C->getEllipsisLoc();
8864 }
8865
8866 // Transform the captured variable.
8867 VarDecl *CapturedVar
8868 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
8869 C->getCapturedVar()));
8870 if (!CapturedVar) {
8871 Invalid = true;
8872 continue;
8873 }
8874
8875 // Capture the transformed variable.
8876 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
8877 }
8878 if (!FinishedExplicitCaptures)
8879 getSema().finishLambdaExplicitCaptures(LSI);
8880
8881
8882 // Enter a new evaluation context to insulate the lambda from any
8883 // cleanups from the enclosing full-expression.
8884 getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
8885
8886 if (Invalid) {
8887 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
8888 /*IsInstantiation=*/true);
8889 return ExprError();
8890 }
8891
8892 // Instantiate the body of the lambda expression.
8893 StmtResult Body = getDerived().TransformStmt(E->getBody());
8894 if (Body.isInvalid()) {
8895 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
8896 /*IsInstantiation=*/true);
8897 return ExprError();
8898 }
8899
8900 return getSema().ActOnLambdaExpr(E->getLocStart(), Body.get(),
8901 /*CurScope=*/nullptr,
8902 /*IsInstantiation=*/true);
8903 }
8904
8905 template<typename Derived>
8906 ExprResult
TransformCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)8907 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
8908 CXXUnresolvedConstructExpr *E) {
8909 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
8910 if (!T)
8911 return ExprError();
8912
8913 bool ArgumentChanged = false;
8914 SmallVector<Expr*, 8> Args;
8915 Args.reserve(E->arg_size());
8916 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
8917 &ArgumentChanged))
8918 return ExprError();
8919
8920 if (!getDerived().AlwaysRebuild() &&
8921 T == E->getTypeSourceInfo() &&
8922 !ArgumentChanged)
8923 return E;
8924
8925 // FIXME: we're faking the locations of the commas
8926 return getDerived().RebuildCXXUnresolvedConstructExpr(T,
8927 E->getLParenLoc(),
8928 Args,
8929 E->getRParenLoc());
8930 }
8931
8932 template<typename Derived>
8933 ExprResult
TransformCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)8934 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
8935 CXXDependentScopeMemberExpr *E) {
8936 // Transform the base of the expression.
8937 ExprResult Base((Expr*) nullptr);
8938 Expr *OldBase;
8939 QualType BaseType;
8940 QualType ObjectType;
8941 if (!E->isImplicitAccess()) {
8942 OldBase = E->getBase();
8943 Base = getDerived().TransformExpr(OldBase);
8944 if (Base.isInvalid())
8945 return ExprError();
8946
8947 // Start the member reference and compute the object's type.
8948 ParsedType ObjectTy;
8949 bool MayBePseudoDestructor = false;
8950 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
8951 E->getOperatorLoc(),
8952 E->isArrow()? tok::arrow : tok::period,
8953 ObjectTy,
8954 MayBePseudoDestructor);
8955 if (Base.isInvalid())
8956 return ExprError();
8957
8958 ObjectType = ObjectTy.get();
8959 BaseType = ((Expr*) Base.get())->getType();
8960 } else {
8961 OldBase = nullptr;
8962 BaseType = getDerived().TransformType(E->getBaseType());
8963 ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
8964 }
8965
8966 // Transform the first part of the nested-name-specifier that qualifies
8967 // the member name.
8968 NamedDecl *FirstQualifierInScope
8969 = getDerived().TransformFirstQualifierInScope(
8970 E->getFirstQualifierFoundInScope(),
8971 E->getQualifierLoc().getBeginLoc());
8972
8973 NestedNameSpecifierLoc QualifierLoc;
8974 if (E->getQualifier()) {
8975 QualifierLoc
8976 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
8977 ObjectType,
8978 FirstQualifierInScope);
8979 if (!QualifierLoc)
8980 return ExprError();
8981 }
8982
8983 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8984
8985 // TODO: If this is a conversion-function-id, verify that the
8986 // destination type name (if present) resolves the same way after
8987 // instantiation as it did in the local scope.
8988
8989 DeclarationNameInfo NameInfo
8990 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
8991 if (!NameInfo.getName())
8992 return ExprError();
8993
8994 if (!E->hasExplicitTemplateArgs()) {
8995 // This is a reference to a member without an explicitly-specified
8996 // template argument list. Optimize for this common case.
8997 if (!getDerived().AlwaysRebuild() &&
8998 Base.get() == OldBase &&
8999 BaseType == E->getBaseType() &&
9000 QualifierLoc == E->getQualifierLoc() &&
9001 NameInfo.getName() == E->getMember() &&
9002 FirstQualifierInScope == E->getFirstQualifierFoundInScope())
9003 return E;
9004
9005 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9006 BaseType,
9007 E->isArrow(),
9008 E->getOperatorLoc(),
9009 QualifierLoc,
9010 TemplateKWLoc,
9011 FirstQualifierInScope,
9012 NameInfo,
9013 /*TemplateArgs*/nullptr);
9014 }
9015
9016 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9017 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9018 E->getNumTemplateArgs(),
9019 TransArgs))
9020 return ExprError();
9021
9022 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9023 BaseType,
9024 E->isArrow(),
9025 E->getOperatorLoc(),
9026 QualifierLoc,
9027 TemplateKWLoc,
9028 FirstQualifierInScope,
9029 NameInfo,
9030 &TransArgs);
9031 }
9032
9033 template<typename Derived>
9034 ExprResult
TransformUnresolvedMemberExpr(UnresolvedMemberExpr * Old)9035 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
9036 // Transform the base of the expression.
9037 ExprResult Base((Expr*) nullptr);
9038 QualType BaseType;
9039 if (!Old->isImplicitAccess()) {
9040 Base = getDerived().TransformExpr(Old->getBase());
9041 if (Base.isInvalid())
9042 return ExprError();
9043 Base = getSema().PerformMemberExprBaseConversion(Base.get(),
9044 Old->isArrow());
9045 if (Base.isInvalid())
9046 return ExprError();
9047 BaseType = Base.get()->getType();
9048 } else {
9049 BaseType = getDerived().TransformType(Old->getBaseType());
9050 }
9051
9052 NestedNameSpecifierLoc QualifierLoc;
9053 if (Old->getQualifierLoc()) {
9054 QualifierLoc
9055 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9056 if (!QualifierLoc)
9057 return ExprError();
9058 }
9059
9060 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9061
9062 LookupResult R(SemaRef, Old->getMemberNameInfo(),
9063 Sema::LookupOrdinaryName);
9064
9065 // Transform all the decls.
9066 for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
9067 E = Old->decls_end(); I != E; ++I) {
9068 NamedDecl *InstD = static_cast<NamedDecl*>(
9069 getDerived().TransformDecl(Old->getMemberLoc(),
9070 *I));
9071 if (!InstD) {
9072 // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9073 // This can happen because of dependent hiding.
9074 if (isa<UsingShadowDecl>(*I))
9075 continue;
9076 else {
9077 R.clear();
9078 return ExprError();
9079 }
9080 }
9081
9082 // Expand using declarations.
9083 if (isa<UsingDecl>(InstD)) {
9084 UsingDecl *UD = cast<UsingDecl>(InstD);
9085 for (auto *I : UD->shadows())
9086 R.addDecl(I);
9087 continue;
9088 }
9089
9090 R.addDecl(InstD);
9091 }
9092
9093 R.resolveKind();
9094
9095 // Determine the naming class.
9096 if (Old->getNamingClass()) {
9097 CXXRecordDecl *NamingClass
9098 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9099 Old->getMemberLoc(),
9100 Old->getNamingClass()));
9101 if (!NamingClass)
9102 return ExprError();
9103
9104 R.setNamingClass(NamingClass);
9105 }
9106
9107 TemplateArgumentListInfo TransArgs;
9108 if (Old->hasExplicitTemplateArgs()) {
9109 TransArgs.setLAngleLoc(Old->getLAngleLoc());
9110 TransArgs.setRAngleLoc(Old->getRAngleLoc());
9111 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9112 Old->getNumTemplateArgs(),
9113 TransArgs))
9114 return ExprError();
9115 }
9116
9117 // FIXME: to do this check properly, we will need to preserve the
9118 // first-qualifier-in-scope here, just in case we had a dependent
9119 // base (and therefore couldn't do the check) and a
9120 // nested-name-qualifier (and therefore could do the lookup).
9121 NamedDecl *FirstQualifierInScope = nullptr;
9122
9123 return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
9124 BaseType,
9125 Old->getOperatorLoc(),
9126 Old->isArrow(),
9127 QualifierLoc,
9128 TemplateKWLoc,
9129 FirstQualifierInScope,
9130 R,
9131 (Old->hasExplicitTemplateArgs()
9132 ? &TransArgs : nullptr));
9133 }
9134
9135 template<typename Derived>
9136 ExprResult
TransformCXXNoexceptExpr(CXXNoexceptExpr * E)9137 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
9138 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9139 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
9140 if (SubExpr.isInvalid())
9141 return ExprError();
9142
9143 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
9144 return E;
9145
9146 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
9147 }
9148
9149 template<typename Derived>
9150 ExprResult
TransformPackExpansionExpr(PackExpansionExpr * E)9151 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
9152 ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
9153 if (Pattern.isInvalid())
9154 return ExprError();
9155
9156 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
9157 return E;
9158
9159 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
9160 E->getNumExpansions());
9161 }
9162
9163 template<typename Derived>
9164 ExprResult
TransformSizeOfPackExpr(SizeOfPackExpr * E)9165 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
9166 // If E is not value-dependent, then nothing will change when we transform it.
9167 // Note: This is an instantiation-centric view.
9168 if (!E->isValueDependent())
9169 return E;
9170
9171 // Note: None of the implementations of TryExpandParameterPacks can ever
9172 // produce a diagnostic when given only a single unexpanded parameter pack,
9173 // so
9174 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
9175 bool ShouldExpand = false;
9176 bool RetainExpansion = false;
9177 Optional<unsigned> NumExpansions;
9178 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
9179 Unexpanded,
9180 ShouldExpand, RetainExpansion,
9181 NumExpansions))
9182 return ExprError();
9183
9184 if (RetainExpansion)
9185 return E;
9186
9187 NamedDecl *Pack = E->getPack();
9188 if (!ShouldExpand) {
9189 Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(),
9190 Pack));
9191 if (!Pack)
9192 return ExprError();
9193 }
9194
9195
9196 // We now know the length of the parameter pack, so build a new expression
9197 // that stores that length.
9198 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
9199 E->getPackLoc(), E->getRParenLoc(),
9200 NumExpansions);
9201 }
9202
9203 template<typename Derived>
9204 ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)9205 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
9206 SubstNonTypeTemplateParmPackExpr *E) {
9207 // Default behavior is to do nothing with this transformation.
9208 return E;
9209 }
9210
9211 template<typename Derived>
9212 ExprResult
TransformSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)9213 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
9214 SubstNonTypeTemplateParmExpr *E) {
9215 // Default behavior is to do nothing with this transformation.
9216 return E;
9217 }
9218
9219 template<typename Derived>
9220 ExprResult
TransformFunctionParmPackExpr(FunctionParmPackExpr * E)9221 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
9222 // Default behavior is to do nothing with this transformation.
9223 return E;
9224 }
9225
9226 template<typename Derived>
9227 ExprResult
TransformMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)9228 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
9229 MaterializeTemporaryExpr *E) {
9230 return getDerived().TransformExpr(E->GetTemporaryExpr());
9231 }
9232
9233 template<typename Derived>
9234 ExprResult
TransformCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)9235 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
9236 CXXStdInitializerListExpr *E) {
9237 return getDerived().TransformExpr(E->getSubExpr());
9238 }
9239
9240 template<typename Derived>
9241 ExprResult
TransformObjCStringLiteral(ObjCStringLiteral * E)9242 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
9243 return SemaRef.MaybeBindToTemporary(E);
9244 }
9245
9246 template<typename Derived>
9247 ExprResult
TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)9248 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
9249 return E;
9250 }
9251
9252 template<typename Derived>
9253 ExprResult
TransformObjCBoxedExpr(ObjCBoxedExpr * E)9254 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
9255 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9256 if (SubExpr.isInvalid())
9257 return ExprError();
9258
9259 if (!getDerived().AlwaysRebuild() &&
9260 SubExpr.get() == E->getSubExpr())
9261 return E;
9262
9263 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
9264 }
9265
9266 template<typename Derived>
9267 ExprResult
TransformObjCArrayLiteral(ObjCArrayLiteral * E)9268 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
9269 // Transform each of the elements.
9270 SmallVector<Expr *, 8> Elements;
9271 bool ArgChanged = false;
9272 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
9273 /*IsCall=*/false, Elements, &ArgChanged))
9274 return ExprError();
9275
9276 if (!getDerived().AlwaysRebuild() && !ArgChanged)
9277 return SemaRef.MaybeBindToTemporary(E);
9278
9279 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
9280 Elements.data(),
9281 Elements.size());
9282 }
9283
9284 template<typename Derived>
9285 ExprResult
TransformObjCDictionaryLiteral(ObjCDictionaryLiteral * E)9286 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
9287 ObjCDictionaryLiteral *E) {
9288 // Transform each of the elements.
9289 SmallVector<ObjCDictionaryElement, 8> Elements;
9290 bool ArgChanged = false;
9291 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
9292 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
9293
9294 if (OrigElement.isPackExpansion()) {
9295 // This key/value element is a pack expansion.
9296 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9297 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
9298 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
9299 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9300
9301 // Determine whether the set of unexpanded parameter packs can
9302 // and should be expanded.
9303 bool Expand = true;
9304 bool RetainExpansion = false;
9305 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
9306 Optional<unsigned> NumExpansions = OrigNumExpansions;
9307 SourceRange PatternRange(OrigElement.Key->getLocStart(),
9308 OrigElement.Value->getLocEnd());
9309 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
9310 PatternRange,
9311 Unexpanded,
9312 Expand, RetainExpansion,
9313 NumExpansions))
9314 return ExprError();
9315
9316 if (!Expand) {
9317 // The transform has determined that we should perform a simple
9318 // transformation on the pack expansion, producing another pack
9319 // expansion.
9320 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9321 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9322 if (Key.isInvalid())
9323 return ExprError();
9324
9325 if (Key.get() != OrigElement.Key)
9326 ArgChanged = true;
9327
9328 ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9329 if (Value.isInvalid())
9330 return ExprError();
9331
9332 if (Value.get() != OrigElement.Value)
9333 ArgChanged = true;
9334
9335 ObjCDictionaryElement Expansion = {
9336 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
9337 };
9338 Elements.push_back(Expansion);
9339 continue;
9340 }
9341
9342 // Record right away that the argument was changed. This needs
9343 // to happen even if the array expands to nothing.
9344 ArgChanged = true;
9345
9346 // The transform has determined that we should perform an elementwise
9347 // expansion of the pattern. Do so.
9348 for (unsigned I = 0; I != *NumExpansions; ++I) {
9349 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9350 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9351 if (Key.isInvalid())
9352 return ExprError();
9353
9354 ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9355 if (Value.isInvalid())
9356 return ExprError();
9357
9358 ObjCDictionaryElement Element = {
9359 Key.get(), Value.get(), SourceLocation(), NumExpansions
9360 };
9361
9362 // If any unexpanded parameter packs remain, we still have a
9363 // pack expansion.
9364 // FIXME: Can this really happen?
9365 if (Key.get()->containsUnexpandedParameterPack() ||
9366 Value.get()->containsUnexpandedParameterPack())
9367 Element.EllipsisLoc = OrigElement.EllipsisLoc;
9368
9369 Elements.push_back(Element);
9370 }
9371
9372 // FIXME: Retain a pack expansion if RetainExpansion is true.
9373
9374 // We've finished with this pack expansion.
9375 continue;
9376 }
9377
9378 // Transform and check key.
9379 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9380 if (Key.isInvalid())
9381 return ExprError();
9382
9383 if (Key.get() != OrigElement.Key)
9384 ArgChanged = true;
9385
9386 // Transform and check value.
9387 ExprResult Value
9388 = getDerived().TransformExpr(OrigElement.Value);
9389 if (Value.isInvalid())
9390 return ExprError();
9391
9392 if (Value.get() != OrigElement.Value)
9393 ArgChanged = true;
9394
9395 ObjCDictionaryElement Element = {
9396 Key.get(), Value.get(), SourceLocation(), None
9397 };
9398 Elements.push_back(Element);
9399 }
9400
9401 if (!getDerived().AlwaysRebuild() && !ArgChanged)
9402 return SemaRef.MaybeBindToTemporary(E);
9403
9404 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
9405 Elements.data(),
9406 Elements.size());
9407 }
9408
9409 template<typename Derived>
9410 ExprResult
TransformObjCEncodeExpr(ObjCEncodeExpr * E)9411 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
9412 TypeSourceInfo *EncodedTypeInfo
9413 = getDerived().TransformType(E->getEncodedTypeSourceInfo());
9414 if (!EncodedTypeInfo)
9415 return ExprError();
9416
9417 if (!getDerived().AlwaysRebuild() &&
9418 EncodedTypeInfo == E->getEncodedTypeSourceInfo())
9419 return E;
9420
9421 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
9422 EncodedTypeInfo,
9423 E->getRParenLoc());
9424 }
9425
9426 template<typename Derived>
9427 ExprResult TreeTransform<Derived>::
TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)9428 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
9429 // This is a kind of implicit conversion, and it needs to get dropped
9430 // and recomputed for the same general reasons that ImplicitCastExprs
9431 // do, as well a more specific one: this expression is only valid when
9432 // it appears *immediately* as an argument expression.
9433 return getDerived().TransformExpr(E->getSubExpr());
9434 }
9435
9436 template<typename Derived>
9437 ExprResult TreeTransform<Derived>::
TransformObjCBridgedCastExpr(ObjCBridgedCastExpr * E)9438 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
9439 TypeSourceInfo *TSInfo
9440 = getDerived().TransformType(E->getTypeInfoAsWritten());
9441 if (!TSInfo)
9442 return ExprError();
9443
9444 ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
9445 if (Result.isInvalid())
9446 return ExprError();
9447
9448 if (!getDerived().AlwaysRebuild() &&
9449 TSInfo == E->getTypeInfoAsWritten() &&
9450 Result.get() == E->getSubExpr())
9451 return E;
9452
9453 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
9454 E->getBridgeKeywordLoc(), TSInfo,
9455 Result.get());
9456 }
9457
9458 template<typename Derived>
9459 ExprResult
TransformObjCMessageExpr(ObjCMessageExpr * E)9460 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
9461 // Transform arguments.
9462 bool ArgChanged = false;
9463 SmallVector<Expr*, 8> Args;
9464 Args.reserve(E->getNumArgs());
9465 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
9466 &ArgChanged))
9467 return ExprError();
9468
9469 if (E->getReceiverKind() == ObjCMessageExpr::Class) {
9470 // Class message: transform the receiver type.
9471 TypeSourceInfo *ReceiverTypeInfo
9472 = getDerived().TransformType(E->getClassReceiverTypeInfo());
9473 if (!ReceiverTypeInfo)
9474 return ExprError();
9475
9476 // If nothing changed, just retain the existing message send.
9477 if (!getDerived().AlwaysRebuild() &&
9478 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
9479 return SemaRef.MaybeBindToTemporary(E);
9480
9481 // Build a new class message send.
9482 SmallVector<SourceLocation, 16> SelLocs;
9483 E->getSelectorLocs(SelLocs);
9484 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
9485 E->getSelector(),
9486 SelLocs,
9487 E->getMethodDecl(),
9488 E->getLeftLoc(),
9489 Args,
9490 E->getRightLoc());
9491 }
9492
9493 // Instance message: transform the receiver
9494 assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
9495 "Only class and instance messages may be instantiated");
9496 ExprResult Receiver
9497 = getDerived().TransformExpr(E->getInstanceReceiver());
9498 if (Receiver.isInvalid())
9499 return ExprError();
9500
9501 // If nothing changed, just retain the existing message send.
9502 if (!getDerived().AlwaysRebuild() &&
9503 Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
9504 return SemaRef.MaybeBindToTemporary(E);
9505
9506 // Build a new instance message send.
9507 SmallVector<SourceLocation, 16> SelLocs;
9508 E->getSelectorLocs(SelLocs);
9509 return getDerived().RebuildObjCMessageExpr(Receiver.get(),
9510 E->getSelector(),
9511 SelLocs,
9512 E->getMethodDecl(),
9513 E->getLeftLoc(),
9514 Args,
9515 E->getRightLoc());
9516 }
9517
9518 template<typename Derived>
9519 ExprResult
TransformObjCSelectorExpr(ObjCSelectorExpr * E)9520 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
9521 return E;
9522 }
9523
9524 template<typename Derived>
9525 ExprResult
TransformObjCProtocolExpr(ObjCProtocolExpr * E)9526 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
9527 return E;
9528 }
9529
9530 template<typename Derived>
9531 ExprResult
TransformObjCIvarRefExpr(ObjCIvarRefExpr * E)9532 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
9533 // Transform the base expression.
9534 ExprResult Base = getDerived().TransformExpr(E->getBase());
9535 if (Base.isInvalid())
9536 return ExprError();
9537
9538 // We don't need to transform the ivar; it will never change.
9539
9540 // If nothing changed, just retain the existing expression.
9541 if (!getDerived().AlwaysRebuild() &&
9542 Base.get() == E->getBase())
9543 return E;
9544
9545 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
9546 E->getLocation(),
9547 E->isArrow(), E->isFreeIvar());
9548 }
9549
9550 template<typename Derived>
9551 ExprResult
TransformObjCPropertyRefExpr(ObjCPropertyRefExpr * E)9552 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
9553 // 'super' and types never change. Property never changes. Just
9554 // retain the existing expression.
9555 if (!E->isObjectReceiver())
9556 return E;
9557
9558 // Transform the base expression.
9559 ExprResult Base = getDerived().TransformExpr(E->getBase());
9560 if (Base.isInvalid())
9561 return ExprError();
9562
9563 // We don't need to transform the property; it will never change.
9564
9565 // If nothing changed, just retain the existing expression.
9566 if (!getDerived().AlwaysRebuild() &&
9567 Base.get() == E->getBase())
9568 return E;
9569
9570 if (E->isExplicitProperty())
9571 return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
9572 E->getExplicitProperty(),
9573 E->getLocation());
9574
9575 return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
9576 SemaRef.Context.PseudoObjectTy,
9577 E->getImplicitPropertyGetter(),
9578 E->getImplicitPropertySetter(),
9579 E->getLocation());
9580 }
9581
9582 template<typename Derived>
9583 ExprResult
TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)9584 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
9585 // Transform the base expression.
9586 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
9587 if (Base.isInvalid())
9588 return ExprError();
9589
9590 // Transform the key expression.
9591 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
9592 if (Key.isInvalid())
9593 return ExprError();
9594
9595 // If nothing changed, just retain the existing expression.
9596 if (!getDerived().AlwaysRebuild() &&
9597 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
9598 return E;
9599
9600 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
9601 Base.get(), Key.get(),
9602 E->getAtIndexMethodDecl(),
9603 E->setAtIndexMethodDecl());
9604 }
9605
9606 template<typename Derived>
9607 ExprResult
TransformObjCIsaExpr(ObjCIsaExpr * E)9608 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
9609 // Transform the base expression.
9610 ExprResult Base = getDerived().TransformExpr(E->getBase());
9611 if (Base.isInvalid())
9612 return ExprError();
9613
9614 // If nothing changed, just retain the existing expression.
9615 if (!getDerived().AlwaysRebuild() &&
9616 Base.get() == E->getBase())
9617 return E;
9618
9619 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
9620 E->getOpLoc(),
9621 E->isArrow());
9622 }
9623
9624 template<typename Derived>
9625 ExprResult
TransformShuffleVectorExpr(ShuffleVectorExpr * E)9626 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
9627 bool ArgumentChanged = false;
9628 SmallVector<Expr*, 8> SubExprs;
9629 SubExprs.reserve(E->getNumSubExprs());
9630 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
9631 SubExprs, &ArgumentChanged))
9632 return ExprError();
9633
9634 if (!getDerived().AlwaysRebuild() &&
9635 !ArgumentChanged)
9636 return E;
9637
9638 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
9639 SubExprs,
9640 E->getRParenLoc());
9641 }
9642
9643 template<typename Derived>
9644 ExprResult
TransformConvertVectorExpr(ConvertVectorExpr * E)9645 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
9646 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
9647 if (SrcExpr.isInvalid())
9648 return ExprError();
9649
9650 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9651 if (!Type)
9652 return ExprError();
9653
9654 if (!getDerived().AlwaysRebuild() &&
9655 Type == E->getTypeSourceInfo() &&
9656 SrcExpr.get() == E->getSrcExpr())
9657 return E;
9658
9659 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
9660 SrcExpr.get(), Type,
9661 E->getRParenLoc());
9662 }
9663
9664 template<typename Derived>
9665 ExprResult
TransformBlockExpr(BlockExpr * E)9666 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
9667 BlockDecl *oldBlock = E->getBlockDecl();
9668
9669 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
9670 BlockScopeInfo *blockScope = SemaRef.getCurBlock();
9671
9672 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
9673 blockScope->TheDecl->setBlockMissingReturnType(
9674 oldBlock->blockMissingReturnType());
9675
9676 SmallVector<ParmVarDecl*, 4> params;
9677 SmallVector<QualType, 4> paramTypes;
9678
9679 // Parameter substitution.
9680 if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
9681 oldBlock->param_begin(),
9682 oldBlock->param_size(),
9683 nullptr, paramTypes, ¶ms)) {
9684 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
9685 return ExprError();
9686 }
9687
9688 const FunctionProtoType *exprFunctionType = E->getFunctionType();
9689 QualType exprResultType =
9690 getDerived().TransformType(exprFunctionType->getReturnType());
9691
9692 QualType functionType =
9693 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes,
9694 exprFunctionType->getExtProtoInfo());
9695 blockScope->FunctionType = functionType;
9696
9697 // Set the parameters on the block decl.
9698 if (!params.empty())
9699 blockScope->TheDecl->setParams(params);
9700
9701 if (!oldBlock->blockMissingReturnType()) {
9702 blockScope->HasImplicitReturnType = false;
9703 blockScope->ReturnType = exprResultType;
9704 }
9705
9706 // Transform the body
9707 StmtResult body = getDerived().TransformStmt(E->getBody());
9708 if (body.isInvalid()) {
9709 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
9710 return ExprError();
9711 }
9712
9713 #ifndef NDEBUG
9714 // In builds with assertions, make sure that we captured everything we
9715 // captured before.
9716 if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
9717 for (const auto &I : oldBlock->captures()) {
9718 VarDecl *oldCapture = I.getVariable();
9719
9720 // Ignore parameter packs.
9721 if (isa<ParmVarDecl>(oldCapture) &&
9722 cast<ParmVarDecl>(oldCapture)->isParameterPack())
9723 continue;
9724
9725 VarDecl *newCapture =
9726 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
9727 oldCapture));
9728 assert(blockScope->CaptureMap.count(newCapture));
9729 }
9730 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
9731 }
9732 #endif
9733
9734 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
9735 /*Scope=*/nullptr);
9736 }
9737
9738 template<typename Derived>
9739 ExprResult
TransformAsTypeExpr(AsTypeExpr * E)9740 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
9741 llvm_unreachable("Cannot transform asType expressions yet");
9742 }
9743
9744 template<typename Derived>
9745 ExprResult
TransformAtomicExpr(AtomicExpr * E)9746 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
9747 QualType RetTy = getDerived().TransformType(E->getType());
9748 bool ArgumentChanged = false;
9749 SmallVector<Expr*, 8> SubExprs;
9750 SubExprs.reserve(E->getNumSubExprs());
9751 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
9752 SubExprs, &ArgumentChanged))
9753 return ExprError();
9754
9755 if (!getDerived().AlwaysRebuild() &&
9756 !ArgumentChanged)
9757 return E;
9758
9759 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
9760 RetTy, E->getOp(), E->getRParenLoc());
9761 }
9762
9763 //===----------------------------------------------------------------------===//
9764 // Type reconstruction
9765 //===----------------------------------------------------------------------===//
9766
9767 template<typename Derived>
RebuildPointerType(QualType PointeeType,SourceLocation Star)9768 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
9769 SourceLocation Star) {
9770 return SemaRef.BuildPointerType(PointeeType, Star,
9771 getDerived().getBaseEntity());
9772 }
9773
9774 template<typename Derived>
RebuildBlockPointerType(QualType PointeeType,SourceLocation Star)9775 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
9776 SourceLocation Star) {
9777 return SemaRef.BuildBlockPointerType(PointeeType, Star,
9778 getDerived().getBaseEntity());
9779 }
9780
9781 template<typename Derived>
9782 QualType
RebuildReferenceType(QualType ReferentType,bool WrittenAsLValue,SourceLocation Sigil)9783 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
9784 bool WrittenAsLValue,
9785 SourceLocation Sigil) {
9786 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
9787 Sigil, getDerived().getBaseEntity());
9788 }
9789
9790 template<typename Derived>
9791 QualType
RebuildMemberPointerType(QualType PointeeType,QualType ClassType,SourceLocation Sigil)9792 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
9793 QualType ClassType,
9794 SourceLocation Sigil) {
9795 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
9796 getDerived().getBaseEntity());
9797 }
9798
9799 template<typename Derived>
9800 QualType
RebuildArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt * Size,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)9801 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
9802 ArrayType::ArraySizeModifier SizeMod,
9803 const llvm::APInt *Size,
9804 Expr *SizeExpr,
9805 unsigned IndexTypeQuals,
9806 SourceRange BracketsRange) {
9807 if (SizeExpr || !Size)
9808 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
9809 IndexTypeQuals, BracketsRange,
9810 getDerived().getBaseEntity());
9811
9812 QualType Types[] = {
9813 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
9814 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
9815 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
9816 };
9817 const unsigned NumTypes = llvm::array_lengthof(Types);
9818 QualType SizeType;
9819 for (unsigned I = 0; I != NumTypes; ++I)
9820 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
9821 SizeType = Types[I];
9822 break;
9823 }
9824
9825 // Note that we can return a VariableArrayType here in the case where
9826 // the element type was a dependent VariableArrayType.
9827 IntegerLiteral *ArraySize
9828 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
9829 /*FIXME*/BracketsRange.getBegin());
9830 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
9831 IndexTypeQuals, BracketsRange,
9832 getDerived().getBaseEntity());
9833 }
9834
9835 template<typename Derived>
9836 QualType
RebuildConstantArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,const llvm::APInt & Size,unsigned IndexTypeQuals,SourceRange BracketsRange)9837 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
9838 ArrayType::ArraySizeModifier SizeMod,
9839 const llvm::APInt &Size,
9840 unsigned IndexTypeQuals,
9841 SourceRange BracketsRange) {
9842 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
9843 IndexTypeQuals, BracketsRange);
9844 }
9845
9846 template<typename Derived>
9847 QualType
RebuildIncompleteArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,unsigned IndexTypeQuals,SourceRange BracketsRange)9848 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
9849 ArrayType::ArraySizeModifier SizeMod,
9850 unsigned IndexTypeQuals,
9851 SourceRange BracketsRange) {
9852 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
9853 IndexTypeQuals, BracketsRange);
9854 }
9855
9856 template<typename Derived>
9857 QualType
RebuildVariableArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)9858 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
9859 ArrayType::ArraySizeModifier SizeMod,
9860 Expr *SizeExpr,
9861 unsigned IndexTypeQuals,
9862 SourceRange BracketsRange) {
9863 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
9864 SizeExpr,
9865 IndexTypeQuals, BracketsRange);
9866 }
9867
9868 template<typename Derived>
9869 QualType
RebuildDependentSizedArrayType(QualType ElementType,ArrayType::ArraySizeModifier SizeMod,Expr * SizeExpr,unsigned IndexTypeQuals,SourceRange BracketsRange)9870 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
9871 ArrayType::ArraySizeModifier SizeMod,
9872 Expr *SizeExpr,
9873 unsigned IndexTypeQuals,
9874 SourceRange BracketsRange) {
9875 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
9876 SizeExpr,
9877 IndexTypeQuals, BracketsRange);
9878 }
9879
9880 template<typename Derived>
RebuildVectorType(QualType ElementType,unsigned NumElements,VectorType::VectorKind VecKind)9881 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
9882 unsigned NumElements,
9883 VectorType::VectorKind VecKind) {
9884 // FIXME: semantic checking!
9885 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
9886 }
9887
9888 template<typename Derived>
RebuildExtVectorType(QualType ElementType,unsigned NumElements,SourceLocation AttributeLoc)9889 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
9890 unsigned NumElements,
9891 SourceLocation AttributeLoc) {
9892 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
9893 NumElements, true);
9894 IntegerLiteral *VectorSize
9895 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
9896 AttributeLoc);
9897 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
9898 }
9899
9900 template<typename Derived>
9901 QualType
RebuildDependentSizedExtVectorType(QualType ElementType,Expr * SizeExpr,SourceLocation AttributeLoc)9902 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
9903 Expr *SizeExpr,
9904 SourceLocation AttributeLoc) {
9905 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
9906 }
9907
9908 template<typename Derived>
RebuildFunctionProtoType(QualType T,MutableArrayRef<QualType> ParamTypes,const FunctionProtoType::ExtProtoInfo & EPI)9909 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
9910 QualType T,
9911 MutableArrayRef<QualType> ParamTypes,
9912 const FunctionProtoType::ExtProtoInfo &EPI) {
9913 return SemaRef.BuildFunctionType(T, ParamTypes,
9914 getDerived().getBaseLocation(),
9915 getDerived().getBaseEntity(),
9916 EPI);
9917 }
9918
9919 template<typename Derived>
RebuildFunctionNoProtoType(QualType T)9920 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
9921 return SemaRef.Context.getFunctionNoProtoType(T);
9922 }
9923
9924 template<typename Derived>
RebuildUnresolvedUsingType(Decl * D)9925 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
9926 assert(D && "no decl found");
9927 if (D->isInvalidDecl()) return QualType();
9928
9929 // FIXME: Doesn't account for ObjCInterfaceDecl!
9930 TypeDecl *Ty;
9931 if (isa<UsingDecl>(D)) {
9932 UsingDecl *Using = cast<UsingDecl>(D);
9933 assert(Using->hasTypename() &&
9934 "UnresolvedUsingTypenameDecl transformed to non-typename using");
9935
9936 // A valid resolved using typename decl points to exactly one type decl.
9937 assert(++Using->shadow_begin() == Using->shadow_end());
9938 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
9939
9940 } else {
9941 assert(isa<UnresolvedUsingTypenameDecl>(D) &&
9942 "UnresolvedUsingTypenameDecl transformed to non-using decl");
9943 Ty = cast<UnresolvedUsingTypenameDecl>(D);
9944 }
9945
9946 return SemaRef.Context.getTypeDeclType(Ty);
9947 }
9948
9949 template<typename Derived>
RebuildTypeOfExprType(Expr * E,SourceLocation Loc)9950 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
9951 SourceLocation Loc) {
9952 return SemaRef.BuildTypeofExprType(E, Loc);
9953 }
9954
9955 template<typename Derived>
RebuildTypeOfType(QualType Underlying)9956 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
9957 return SemaRef.Context.getTypeOfType(Underlying);
9958 }
9959
9960 template<typename Derived>
RebuildDecltypeType(Expr * E,SourceLocation Loc)9961 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
9962 SourceLocation Loc) {
9963 return SemaRef.BuildDecltypeType(E, Loc);
9964 }
9965
9966 template<typename Derived>
RebuildUnaryTransformType(QualType BaseType,UnaryTransformType::UTTKind UKind,SourceLocation Loc)9967 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
9968 UnaryTransformType::UTTKind UKind,
9969 SourceLocation Loc) {
9970 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
9971 }
9972
9973 template<typename Derived>
RebuildTemplateSpecializationType(TemplateName Template,SourceLocation TemplateNameLoc,TemplateArgumentListInfo & TemplateArgs)9974 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
9975 TemplateName Template,
9976 SourceLocation TemplateNameLoc,
9977 TemplateArgumentListInfo &TemplateArgs) {
9978 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
9979 }
9980
9981 template<typename Derived>
RebuildAtomicType(QualType ValueType,SourceLocation KWLoc)9982 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
9983 SourceLocation KWLoc) {
9984 return SemaRef.BuildAtomicType(ValueType, KWLoc);
9985 }
9986
9987 template<typename Derived>
9988 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,bool TemplateKW,TemplateDecl * Template)9989 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
9990 bool TemplateKW,
9991 TemplateDecl *Template) {
9992 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
9993 Template);
9994 }
9995
9996 template<typename Derived>
9997 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,const IdentifierInfo & Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)9998 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
9999 const IdentifierInfo &Name,
10000 SourceLocation NameLoc,
10001 QualType ObjectType,
10002 NamedDecl *FirstQualifierInScope) {
10003 UnqualifiedId TemplateName;
10004 TemplateName.setIdentifier(&Name, NameLoc);
10005 Sema::TemplateTy Template;
10006 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10007 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10008 SS, TemplateKWLoc, TemplateName,
10009 ParsedType::make(ObjectType),
10010 /*EnteringContext=*/false,
10011 Template);
10012 return Template.get();
10013 }
10014
10015 template<typename Derived>
10016 TemplateName
RebuildTemplateName(CXXScopeSpec & SS,OverloadedOperatorKind Operator,SourceLocation NameLoc,QualType ObjectType)10017 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10018 OverloadedOperatorKind Operator,
10019 SourceLocation NameLoc,
10020 QualType ObjectType) {
10021 UnqualifiedId Name;
10022 // FIXME: Bogus location information.
10023 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
10024 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
10025 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10026 Sema::TemplateTy Template;
10027 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10028 SS, TemplateKWLoc, Name,
10029 ParsedType::make(ObjectType),
10030 /*EnteringContext=*/false,
10031 Template);
10032 return Template.get();
10033 }
10034
10035 template<typename Derived>
10036 ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,SourceLocation OpLoc,Expr * OrigCallee,Expr * First,Expr * Second)10037 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
10038 SourceLocation OpLoc,
10039 Expr *OrigCallee,
10040 Expr *First,
10041 Expr *Second) {
10042 Expr *Callee = OrigCallee->IgnoreParenCasts();
10043 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
10044
10045 if (First->getObjectKind() == OK_ObjCProperty) {
10046 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10047 if (BinaryOperator::isAssignmentOp(Opc))
10048 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
10049 First, Second);
10050 ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
10051 if (Result.isInvalid())
10052 return ExprError();
10053 First = Result.get();
10054 }
10055
10056 if (Second && Second->getObjectKind() == OK_ObjCProperty) {
10057 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
10058 if (Result.isInvalid())
10059 return ExprError();
10060 Second = Result.get();
10061 }
10062
10063 // Determine whether this should be a builtin operation.
10064 if (Op == OO_Subscript) {
10065 if (!First->getType()->isOverloadableType() &&
10066 !Second->getType()->isOverloadableType())
10067 return getSema().CreateBuiltinArraySubscriptExpr(First,
10068 Callee->getLocStart(),
10069 Second, OpLoc);
10070 } else if (Op == OO_Arrow) {
10071 // -> is never a builtin operation.
10072 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
10073 } else if (Second == nullptr || isPostIncDec) {
10074 if (!First->getType()->isOverloadableType()) {
10075 // The argument is not of overloadable type, so try to create a
10076 // built-in unary operation.
10077 UnaryOperatorKind Opc
10078 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10079
10080 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
10081 }
10082 } else {
10083 if (!First->getType()->isOverloadableType() &&
10084 !Second->getType()->isOverloadableType()) {
10085 // Neither of the arguments is an overloadable type, so try to
10086 // create a built-in binary operation.
10087 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10088 ExprResult Result
10089 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
10090 if (Result.isInvalid())
10091 return ExprError();
10092
10093 return Result;
10094 }
10095 }
10096
10097 // Compute the transformed set of functions (and function templates) to be
10098 // used during overload resolution.
10099 UnresolvedSet<16> Functions;
10100
10101 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
10102 assert(ULE->requiresADL());
10103 Functions.append(ULE->decls_begin(), ULE->decls_end());
10104 } else {
10105 // If we've resolved this to a particular non-member function, just call
10106 // that function. If we resolved it to a member function,
10107 // CreateOverloaded* will find that function for us.
10108 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
10109 if (!isa<CXXMethodDecl>(ND))
10110 Functions.addDecl(ND);
10111 }
10112
10113 // Add any functions found via argument-dependent lookup.
10114 Expr *Args[2] = { First, Second };
10115 unsigned NumArgs = 1 + (Second != nullptr);
10116
10117 // Create the overloaded operator invocation for unary operators.
10118 if (NumArgs == 1 || isPostIncDec) {
10119 UnaryOperatorKind Opc
10120 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10121 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
10122 }
10123
10124 if (Op == OO_Subscript) {
10125 SourceLocation LBrace;
10126 SourceLocation RBrace;
10127
10128 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
10129 DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo();
10130 LBrace = SourceLocation::getFromRawEncoding(
10131 NameLoc.CXXOperatorName.BeginOpNameLoc);
10132 RBrace = SourceLocation::getFromRawEncoding(
10133 NameLoc.CXXOperatorName.EndOpNameLoc);
10134 } else {
10135 LBrace = Callee->getLocStart();
10136 RBrace = OpLoc;
10137 }
10138
10139 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
10140 First, Second);
10141 }
10142
10143 // Create the overloaded operator invocation for binary operators.
10144 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10145 ExprResult Result
10146 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
10147 if (Result.isInvalid())
10148 return ExprError();
10149
10150 return Result;
10151 }
10152
10153 template<typename Derived>
10154 ExprResult
RebuildCXXPseudoDestructorExpr(Expr * Base,SourceLocation OperatorLoc,bool isArrow,CXXScopeSpec & SS,TypeSourceInfo * ScopeType,SourceLocation CCLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage Destroyed)10155 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
10156 SourceLocation OperatorLoc,
10157 bool isArrow,
10158 CXXScopeSpec &SS,
10159 TypeSourceInfo *ScopeType,
10160 SourceLocation CCLoc,
10161 SourceLocation TildeLoc,
10162 PseudoDestructorTypeStorage Destroyed) {
10163 QualType BaseType = Base->getType();
10164 if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
10165 (!isArrow && !BaseType->getAs<RecordType>()) ||
10166 (isArrow && BaseType->getAs<PointerType>() &&
10167 !BaseType->getAs<PointerType>()->getPointeeType()
10168 ->template getAs<RecordType>())){
10169 // This pseudo-destructor expression is still a pseudo-destructor.
10170 return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
10171 isArrow? tok::arrow : tok::period,
10172 SS, ScopeType, CCLoc, TildeLoc,
10173 Destroyed,
10174 /*FIXME?*/true);
10175 }
10176
10177 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
10178 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
10179 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
10180 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
10181 NameInfo.setNamedTypeInfo(DestroyedType);
10182
10183 // The scope type is now known to be a valid nested name specifier
10184 // component. Tack it on to the end of the nested name specifier.
10185 if (ScopeType)
10186 SS.Extend(SemaRef.Context, SourceLocation(),
10187 ScopeType->getTypeLoc(), CCLoc);
10188
10189 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10190 return getSema().BuildMemberReferenceExpr(Base, BaseType,
10191 OperatorLoc, isArrow,
10192 SS, TemplateKWLoc,
10193 /*FIXME: FirstQualifier*/ nullptr,
10194 NameInfo,
10195 /*TemplateArgs*/ nullptr);
10196 }
10197
10198 template<typename Derived>
10199 StmtResult
TransformCapturedStmt(CapturedStmt * S)10200 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
10201 SourceLocation Loc = S->getLocStart();
10202 CapturedDecl *CD = S->getCapturedDecl();
10203 unsigned NumParams = CD->getNumParams();
10204 unsigned ContextParamPos = CD->getContextParamPosition();
10205 SmallVector<Sema::CapturedParamNameType, 4> Params;
10206 for (unsigned I = 0; I < NumParams; ++I) {
10207 if (I != ContextParamPos) {
10208 Params.push_back(
10209 std::make_pair(
10210 CD->getParam(I)->getName(),
10211 getDerived().TransformType(CD->getParam(I)->getType())));
10212 } else {
10213 Params.push_back(std::make_pair(StringRef(), QualType()));
10214 }
10215 }
10216 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
10217 S->getCapturedRegionKind(), Params);
10218 StmtResult Body;
10219 {
10220 Sema::CompoundScopeRAII CompoundScope(getSema());
10221 Body = getDerived().TransformStmt(S->getCapturedStmt());
10222 }
10223
10224 if (Body.isInvalid()) {
10225 getSema().ActOnCapturedRegionError();
10226 return StmtError();
10227 }
10228
10229 return getSema().ActOnCapturedRegionEnd(Body.get());
10230 }
10231
10232 } // end namespace clang
10233
10234 #endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
10235