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