]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/clang/lib/Sema/TreeTransform.h
Move all sources from the llvm project into contrib/llvm-project.
[FreeBSD/FreeBSD.git] / contrib / llvm-project / clang / lib / Sema / TreeTransform.h
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15
16 #include "CoroutineStmtBuilder.h"
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/ExprOpenMP.h"
25 #include "clang/AST/Stmt.h"
26 #include "clang/AST/StmtCXX.h"
27 #include "clang/AST/StmtObjC.h"
28 #include "clang/AST/StmtOpenMP.h"
29 #include "clang/Sema/Designator.h"
30 #include "clang/Sema/Lookup.h"
31 #include "clang/Sema/Ownership.h"
32 #include "clang/Sema/ParsedTemplate.h"
33 #include "clang/Sema/ScopeInfo.h"
34 #include "clang/Sema/SemaDiagnostic.h"
35 #include "clang/Sema/SemaInternal.h"
36 #include "llvm/ADT/ArrayRef.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include <algorithm>
39
40 namespace clang {
41 using namespace sema;
42
43 /// A semantic tree transformation that allows one to transform one
44 /// abstract syntax tree into another.
45 ///
46 /// A new tree transformation is defined by creating a new subclass \c X of
47 /// \c TreeTransform<X> and then overriding certain operations to provide
48 /// behavior specific to that transformation. For example, template
49 /// instantiation is implemented as a tree transformation where the
50 /// transformation of TemplateTypeParmType nodes involves substituting the
51 /// template arguments for their corresponding template parameters; a similar
52 /// transformation is performed for non-type template parameters and
53 /// template template parameters.
54 ///
55 /// This tree-transformation template uses static polymorphism to allow
56 /// subclasses to customize any of its operations. Thus, a subclass can
57 /// override any of the transformation or rebuild operators by providing an
58 /// operation with the same signature as the default implementation. The
59 /// overriding function should not be virtual.
60 ///
61 /// Semantic tree transformations are split into two stages, either of which
62 /// can be replaced by a subclass. The "transform" step transforms an AST node
63 /// or the parts of an AST node using the various transformation functions,
64 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
65 /// node of the appropriate kind from the pieces. The default transformation
66 /// routines recursively transform the operands to composite AST nodes (e.g.,
67 /// the pointee type of a PointerType node) and, if any of those operand nodes
68 /// were changed by the transformation, invokes the rebuild operation to create
69 /// a new AST node.
70 ///
71 /// Subclasses can customize the transformation at various levels. The
72 /// most coarse-grained transformations involve replacing TransformType(),
73 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
74 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
75 /// new implementations.
76 ///
77 /// For more fine-grained transformations, subclasses can replace any of the
78 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
79 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
80 /// replacing TransformTemplateTypeParmType() allows template instantiation
81 /// to substitute template arguments for their corresponding template
82 /// parameters. Additionally, subclasses can override the \c RebuildXXX
83 /// functions to control how AST nodes are rebuilt when their operands change.
84 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
85 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
86 /// be able to use more efficient rebuild steps.
87 ///
88 /// There are a handful of other functions that can be overridden, allowing one
89 /// to avoid traversing nodes that don't need any transformation
90 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
91 /// operands have not changed (\c AlwaysRebuild()), and customize the
92 /// default locations and entity names used for type-checking
93 /// (\c getBaseLocation(), \c getBaseEntity()).
94 template<typename Derived>
95 class TreeTransform {
96   /// Private RAII object that helps us forget and then re-remember
97   /// the template argument corresponding to a partially-substituted parameter
98   /// pack.
99   class ForgetPartiallySubstitutedPackRAII {
100     Derived &Self;
101     TemplateArgument Old;
102
103   public:
104     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
105       Old = Self.ForgetPartiallySubstitutedPack();
106     }
107
108     ~ForgetPartiallySubstitutedPackRAII() {
109       Self.RememberPartiallySubstitutedPack(Old);
110     }
111   };
112
113 protected:
114   Sema &SemaRef;
115
116   /// The set of local declarations that have been transformed, for
117   /// cases where we are forced to build new declarations within the transformer
118   /// rather than in the subclass (e.g., lambda closure types).
119   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
120
121 public:
122   /// Initializes a new tree transformer.
123   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
124
125   /// Retrieves a reference to the derived class.
126   Derived &getDerived() { return static_cast<Derived&>(*this); }
127
128   /// Retrieves a reference to the derived class.
129   const Derived &getDerived() const {
130     return static_cast<const Derived&>(*this);
131   }
132
133   static inline ExprResult Owned(Expr *E) { return E; }
134   static inline StmtResult Owned(Stmt *S) { return S; }
135
136   /// Retrieves a reference to the semantic analysis object used for
137   /// this tree transform.
138   Sema &getSema() const { return SemaRef; }
139
140   /// Whether the transformation should always rebuild AST nodes, even
141   /// if none of the children have changed.
142   ///
143   /// Subclasses may override this function to specify when the transformation
144   /// should rebuild all AST nodes.
145   ///
146   /// We must always rebuild all AST nodes when performing variadic template
147   /// pack expansion, in order to avoid violating the AST invariant that each
148   /// statement node appears at most once in its containing declaration.
149   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
150
151   /// Whether the transformation is forming an expression or statement that
152   /// replaces the original. In this case, we'll reuse mangling numbers from
153   /// existing lambdas.
154   bool ReplacingOriginal() { return false; }
155
156   /// Returns the location of the entity being transformed, if that
157   /// information was not available elsewhere in the AST.
158   ///
159   /// By default, returns no source-location information. Subclasses can
160   /// provide an alternative implementation that provides better location
161   /// information.
162   SourceLocation getBaseLocation() { return SourceLocation(); }
163
164   /// Returns the name of the entity being transformed, if that
165   /// information was not available elsewhere in the AST.
166   ///
167   /// By default, returns an empty name. Subclasses can provide an alternative
168   /// implementation with a more precise name.
169   DeclarationName getBaseEntity() { return DeclarationName(); }
170
171   /// Sets the "base" location and entity when that
172   /// information is known based on another transformation.
173   ///
174   /// By default, the source location and entity are ignored. Subclasses can
175   /// override this function to provide a customized implementation.
176   void setBase(SourceLocation Loc, DeclarationName Entity) { }
177
178   /// RAII object that temporarily sets the base location and entity
179   /// used for reporting diagnostics in types.
180   class TemporaryBase {
181     TreeTransform &Self;
182     SourceLocation OldLocation;
183     DeclarationName OldEntity;
184
185   public:
186     TemporaryBase(TreeTransform &Self, SourceLocation Location,
187                   DeclarationName Entity) : Self(Self) {
188       OldLocation = Self.getDerived().getBaseLocation();
189       OldEntity = Self.getDerived().getBaseEntity();
190
191       if (Location.isValid())
192         Self.getDerived().setBase(Location, Entity);
193     }
194
195     ~TemporaryBase() {
196       Self.getDerived().setBase(OldLocation, OldEntity);
197     }
198   };
199
200   /// Determine whether the given type \p T has already been
201   /// transformed.
202   ///
203   /// Subclasses can provide an alternative implementation of this routine
204   /// to short-circuit evaluation when it is known that a given type will
205   /// not change. For example, template instantiation need not traverse
206   /// non-dependent types.
207   bool AlreadyTransformed(QualType T) {
208     return T.isNull();
209   }
210
211   /// Determine whether the given call argument should be dropped, e.g.,
212   /// because it is a default argument.
213   ///
214   /// Subclasses can provide an alternative implementation of this routine to
215   /// determine which kinds of call arguments get dropped. By default,
216   /// CXXDefaultArgument nodes are dropped (prior to transformation).
217   bool DropCallArgument(Expr *E) {
218     return E->isDefaultArgument();
219   }
220
221   /// Determine whether we should expand a pack expansion with the
222   /// given set of parameter packs into separate arguments by repeatedly
223   /// transforming the pattern.
224   ///
225   /// By default, the transformer never tries to expand pack expansions.
226   /// Subclasses can override this routine to provide different behavior.
227   ///
228   /// \param EllipsisLoc The location of the ellipsis that identifies the
229   /// pack expansion.
230   ///
231   /// \param PatternRange The source range that covers the entire pattern of
232   /// the pack expansion.
233   ///
234   /// \param Unexpanded The set of unexpanded parameter packs within the
235   /// pattern.
236   ///
237   /// \param ShouldExpand Will be set to \c true if the transformer should
238   /// expand the corresponding pack expansions into separate arguments. When
239   /// set, \c NumExpansions must also be set.
240   ///
241   /// \param RetainExpansion Whether the caller should add an unexpanded
242   /// pack expansion after all of the expanded arguments. This is used
243   /// when extending explicitly-specified template argument packs per
244   /// C++0x [temp.arg.explicit]p9.
245   ///
246   /// \param NumExpansions The number of separate arguments that will be in
247   /// the expanded form of the corresponding pack expansion. This is both an
248   /// input and an output parameter, which can be set by the caller if the
249   /// number of expansions is known a priori (e.g., due to a prior substitution)
250   /// and will be set by the callee when the number of expansions is known.
251   /// The callee must set this value when \c ShouldExpand is \c true; it may
252   /// set this value in other cases.
253   ///
254   /// \returns true if an error occurred (e.g., because the parameter packs
255   /// are to be instantiated with arguments of different lengths), false
256   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
257   /// must be set.
258   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
259                                SourceRange PatternRange,
260                                ArrayRef<UnexpandedParameterPack> Unexpanded,
261                                bool &ShouldExpand,
262                                bool &RetainExpansion,
263                                Optional<unsigned> &NumExpansions) {
264     ShouldExpand = false;
265     return false;
266   }
267
268   /// "Forget" about the partially-substituted pack template argument,
269   /// when performing an instantiation that must preserve the parameter pack
270   /// use.
271   ///
272   /// This routine is meant to be overridden by the template instantiator.
273   TemplateArgument ForgetPartiallySubstitutedPack() {
274     return TemplateArgument();
275   }
276
277   /// "Remember" the partially-substituted pack template argument
278   /// after performing an instantiation that must preserve the parameter pack
279   /// use.
280   ///
281   /// This routine is meant to be overridden by the template instantiator.
282   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
283
284   /// Note to the derived class when a function parameter pack is
285   /// being expanded.
286   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
287
288   /// Transforms the given type into another type.
289   ///
290   /// By default, this routine transforms a type by creating a
291   /// TypeSourceInfo for it and delegating to the appropriate
292   /// function.  This is expensive, but we don't mind, because
293   /// this method is deprecated anyway;  all users should be
294   /// switched to storing TypeSourceInfos.
295   ///
296   /// \returns the transformed type.
297   QualType TransformType(QualType T);
298
299   /// Transforms the given type-with-location into a new
300   /// type-with-location.
301   ///
302   /// By default, this routine transforms a type by delegating to the
303   /// appropriate TransformXXXType to build a new type.  Subclasses
304   /// may override this function (to take over all type
305   /// transformations) or some set of the TransformXXXType functions
306   /// to alter the transformation.
307   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
308
309   /// Transform the given type-with-location into a new
310   /// type, collecting location information in the given builder
311   /// as necessary.
312   ///
313   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
314
315   /// Transform a type that is permitted to produce a
316   /// DeducedTemplateSpecializationType.
317   ///
318   /// This is used in the (relatively rare) contexts where it is acceptable
319   /// for transformation to produce a class template type with deduced
320   /// template arguments.
321   /// @{
322   QualType TransformTypeWithDeducedTST(QualType T);
323   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
324   /// @}
325
326   /// The reason why the value of a statement is not discarded, if any.
327   enum StmtDiscardKind {
328     SDK_Discarded,
329     SDK_NotDiscarded,
330     SDK_StmtExprResult,
331   };
332
333   /// Transform the given statement.
334   ///
335   /// By default, this routine transforms a statement by delegating to the
336   /// appropriate TransformXXXStmt function to transform a specific kind of
337   /// statement or the TransformExpr() function to transform an expression.
338   /// Subclasses may override this function to transform statements using some
339   /// other mechanism.
340   ///
341   /// \returns the transformed statement.
342   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
343
344   /// Transform the given statement.
345   ///
346   /// By default, this routine transforms a statement by delegating to the
347   /// appropriate TransformOMPXXXClause function to transform a specific kind
348   /// of clause. Subclasses may override this function to transform statements
349   /// using some other mechanism.
350   ///
351   /// \returns the transformed OpenMP clause.
352   OMPClause *TransformOMPClause(OMPClause *S);
353
354   /// Transform the given attribute.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXAttr function to transform a specific kind
358   /// of attribute. Subclasses may override this function to transform
359   /// attributed statements using some other mechanism.
360   ///
361   /// \returns the transformed attribute
362   const Attr *TransformAttr(const Attr *S);
363
364 /// Transform the specified attribute.
365 ///
366 /// Subclasses should override the transformation of attributes with a pragma
367 /// spelling to transform expressions stored within the attribute.
368 ///
369 /// \returns the transformed attribute.
370 #define ATTR(X)
371 #define PRAGMA_SPELLING_ATTR(X)                                                \
372   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
373 #include "clang/Basic/AttrList.inc"
374
375   /// Transform the given expression.
376   ///
377   /// By default, this routine transforms an expression by delegating to the
378   /// appropriate TransformXXXExpr function to build a new expression.
379   /// Subclasses may override this function to transform expressions using some
380   /// other mechanism.
381   ///
382   /// \returns the transformed expression.
383   ExprResult TransformExpr(Expr *E);
384
385   /// Transform the given initializer.
386   ///
387   /// By default, this routine transforms an initializer by stripping off the
388   /// semantic nodes added by initialization, then passing the result to
389   /// TransformExpr or TransformExprs.
390   ///
391   /// \returns the transformed initializer.
392   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
393
394   /// Transform the given list of expressions.
395   ///
396   /// This routine transforms a list of expressions by invoking
397   /// \c TransformExpr() for each subexpression. However, it also provides
398   /// support for variadic templates by expanding any pack expansions (if the
399   /// derived class permits such expansion) along the way. When pack expansions
400   /// are present, the number of outputs may not equal the number of inputs.
401   ///
402   /// \param Inputs The set of expressions to be transformed.
403   ///
404   /// \param NumInputs The number of expressions in \c Inputs.
405   ///
406   /// \param IsCall If \c true, then this transform is being performed on
407   /// function-call arguments, and any arguments that should be dropped, will
408   /// be.
409   ///
410   /// \param Outputs The transformed input expressions will be added to this
411   /// vector.
412   ///
413   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
414   /// due to transformation.
415   ///
416   /// \returns true if an error occurred, false otherwise.
417   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
418                       SmallVectorImpl<Expr *> &Outputs,
419                       bool *ArgChanged = nullptr);
420
421   /// Transform the given declaration, which is referenced from a type
422   /// or expression.
423   ///
424   /// By default, acts as the identity function on declarations, unless the
425   /// transformer has had to transform the declaration itself. Subclasses
426   /// may override this function to provide alternate behavior.
427   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
428     llvm::DenseMap<Decl *, Decl *>::iterator Known
429       = TransformedLocalDecls.find(D);
430     if (Known != TransformedLocalDecls.end())
431       return Known->second;
432
433     return D;
434   }
435
436   /// Transform the specified condition.
437   ///
438   /// By default, this transforms the variable and expression and rebuilds
439   /// the condition.
440   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
441                                            Expr *Expr,
442                                            Sema::ConditionKind Kind);
443
444   /// Transform the attributes associated with the given declaration and
445   /// place them on the new declaration.
446   ///
447   /// By default, this operation does nothing. Subclasses may override this
448   /// behavior to transform attributes.
449   void transformAttrs(Decl *Old, Decl *New) { }
450
451   /// Note that a local declaration has been transformed by this
452   /// transformer.
453   ///
454   /// Local declarations are typically transformed via a call to
455   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
456   /// the transformer itself has to transform the declarations. This routine
457   /// can be overridden by a subclass that keeps track of such mappings.
458   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
459     assert(New.size() == 1 &&
460            "must override transformedLocalDecl if performing pack expansion");
461     TransformedLocalDecls[Old] = New.front();
462   }
463
464   /// Transform the definition of the given declaration.
465   ///
466   /// By default, invokes TransformDecl() to transform the declaration.
467   /// Subclasses may override this function to provide alternate behavior.
468   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
469     return getDerived().TransformDecl(Loc, D);
470   }
471
472   /// Transform the given declaration, which was the first part of a
473   /// nested-name-specifier in a member access expression.
474   ///
475   /// This specific declaration transformation only applies to the first
476   /// identifier in a nested-name-specifier of a member access expression, e.g.,
477   /// the \c T in \c x->T::member
478   ///
479   /// By default, invokes TransformDecl() to transform the declaration.
480   /// Subclasses may override this function to provide alternate behavior.
481   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
482     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
483   }
484
485   /// Transform the set of declarations in an OverloadExpr.
486   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
487                                   LookupResult &R);
488
489   /// Transform the given nested-name-specifier with source-location
490   /// information.
491   ///
492   /// By default, transforms all of the types and declarations within the
493   /// nested-name-specifier. Subclasses may override this function to provide
494   /// alternate behavior.
495   NestedNameSpecifierLoc
496   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
497                                   QualType ObjectType = QualType(),
498                                   NamedDecl *FirstQualifierInScope = nullptr);
499
500   /// Transform the given declaration name.
501   ///
502   /// By default, transforms the types of conversion function, constructor,
503   /// and destructor names and then (if needed) rebuilds the declaration name.
504   /// Identifiers and selectors are returned unmodified. Sublcasses may
505   /// override this function to provide alternate behavior.
506   DeclarationNameInfo
507   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
508
509   /// Transform the given template name.
510   ///
511   /// \param SS The nested-name-specifier that qualifies the template
512   /// name. This nested-name-specifier must already have been transformed.
513   ///
514   /// \param Name The template name to transform.
515   ///
516   /// \param NameLoc The source location of the template name.
517   ///
518   /// \param ObjectType If we're translating a template name within a member
519   /// access expression, this is the type of the object whose member template
520   /// is being referenced.
521   ///
522   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
523   /// also refers to a name within the current (lexical) scope, this is the
524   /// declaration it refers to.
525   ///
526   /// By default, transforms the template name by transforming the declarations
527   /// and nested-name-specifiers that occur within the template name.
528   /// Subclasses may override this function to provide alternate behavior.
529   TemplateName
530   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
531                         SourceLocation NameLoc,
532                         QualType ObjectType = QualType(),
533                         NamedDecl *FirstQualifierInScope = nullptr,
534                         bool AllowInjectedClassName = false);
535
536   /// Transform the given template argument.
537   ///
538   /// By default, this operation transforms the type, expression, or
539   /// declaration stored within the template argument and constructs a
540   /// new template argument from the transformed result. Subclasses may
541   /// override this function to provide alternate behavior.
542   ///
543   /// Returns true if there was an error.
544   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
545                                  TemplateArgumentLoc &Output,
546                                  bool Uneval = false);
547
548   /// Transform the given set of template arguments.
549   ///
550   /// By default, this operation transforms all of the template arguments
551   /// in the input set using \c TransformTemplateArgument(), and appends
552   /// the transformed arguments to the output list.
553   ///
554   /// Note that this overload of \c TransformTemplateArguments() is merely
555   /// a convenience function. Subclasses that wish to override this behavior
556   /// should override the iterator-based member template version.
557   ///
558   /// \param Inputs The set of template arguments to be transformed.
559   ///
560   /// \param NumInputs The number of template arguments in \p Inputs.
561   ///
562   /// \param Outputs The set of transformed template arguments output by this
563   /// routine.
564   ///
565   /// Returns true if an error occurred.
566   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
567                                   unsigned NumInputs,
568                                   TemplateArgumentListInfo &Outputs,
569                                   bool Uneval = false) {
570     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
571                                       Uneval);
572   }
573
574   /// Transform the given set of template arguments.
575   ///
576   /// By default, this operation transforms all of the template arguments
577   /// in the input set using \c TransformTemplateArgument(), and appends
578   /// the transformed arguments to the output list.
579   ///
580   /// \param First An iterator to the first template argument.
581   ///
582   /// \param Last An iterator one step past the last template argument.
583   ///
584   /// \param Outputs The set of transformed template arguments output by this
585   /// routine.
586   ///
587   /// Returns true if an error occurred.
588   template<typename InputIterator>
589   bool TransformTemplateArguments(InputIterator First,
590                                   InputIterator Last,
591                                   TemplateArgumentListInfo &Outputs,
592                                   bool Uneval = false);
593
594   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
595   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
596                                  TemplateArgumentLoc &ArgLoc);
597
598   /// Fakes up a TypeSourceInfo for a type.
599   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
600     return SemaRef.Context.getTrivialTypeSourceInfo(T,
601                        getDerived().getBaseLocation());
602   }
603
604 #define ABSTRACT_TYPELOC(CLASS, PARENT)
605 #define TYPELOC(CLASS, PARENT)                                   \
606   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
607 #include "clang/AST/TypeLocNodes.def"
608
609   template<typename Fn>
610   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
611                                       FunctionProtoTypeLoc TL,
612                                       CXXRecordDecl *ThisContext,
613                                       Qualifiers ThisTypeQuals,
614                                       Fn TransformExceptionSpec);
615
616   bool TransformExceptionSpec(SourceLocation Loc,
617                               FunctionProtoType::ExceptionSpecInfo &ESI,
618                               SmallVectorImpl<QualType> &Exceptions,
619                               bool &Changed);
620
621   StmtResult TransformSEHHandler(Stmt *Handler);
622
623   QualType
624   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
625                                       TemplateSpecializationTypeLoc TL,
626                                       TemplateName Template);
627
628   QualType
629   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
630                                       DependentTemplateSpecializationTypeLoc TL,
631                                                TemplateName Template,
632                                                CXXScopeSpec &SS);
633
634   QualType TransformDependentTemplateSpecializationType(
635       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
636       NestedNameSpecifierLoc QualifierLoc);
637
638   /// Transforms the parameters of a function type into the
639   /// given vectors.
640   ///
641   /// The result vectors should be kept in sync; null entries in the
642   /// variables vector are acceptable.
643   ///
644   /// Return true on error.
645   bool TransformFunctionTypeParams(
646       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
647       const QualType *ParamTypes,
648       const FunctionProtoType::ExtParameterInfo *ParamInfos,
649       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
650       Sema::ExtParameterInfoBuilder &PInfos);
651
652   /// Transforms a single function-type parameter.  Return null
653   /// on error.
654   ///
655   /// \param indexAdjustment - A number to add to the parameter's
656   ///   scope index;  can be negative
657   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
658                                           int indexAdjustment,
659                                           Optional<unsigned> NumExpansions,
660                                           bool ExpectParameterPack);
661
662   /// Transform the body of a lambda-expression.
663   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
664   /// Alternative implementation of TransformLambdaBody that skips transforming
665   /// the body.
666   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
667
668   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
669
670   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
671   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
672
673   TemplateParameterList *TransformTemplateParameterList(
674         TemplateParameterList *TPL) {
675     return TPL;
676   }
677
678   ExprResult TransformAddressOfOperand(Expr *E);
679
680   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
681                                                 bool IsAddressOfOperand,
682                                                 TypeSourceInfo **RecoveryTSI);
683
684   ExprResult TransformParenDependentScopeDeclRefExpr(
685       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
686       TypeSourceInfo **RecoveryTSI);
687
688   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
689
690 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
691 // amount of stack usage with clang.
692 #define STMT(Node, Parent)                        \
693   LLVM_ATTRIBUTE_NOINLINE \
694   StmtResult Transform##Node(Node *S);
695 #define VALUESTMT(Node, Parent)                   \
696   LLVM_ATTRIBUTE_NOINLINE \
697   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
698 #define EXPR(Node, Parent)                        \
699   LLVM_ATTRIBUTE_NOINLINE \
700   ExprResult Transform##Node(Node *E);
701 #define ABSTRACT_STMT(Stmt)
702 #include "clang/AST/StmtNodes.inc"
703
704 #define OPENMP_CLAUSE(Name, Class)                        \
705   LLVM_ATTRIBUTE_NOINLINE \
706   OMPClause *Transform ## Class(Class *S);
707 #include "clang/Basic/OpenMPKinds.def"
708
709   /// Build a new qualified type given its unqualified type and type location.
710   ///
711   /// By default, this routine adds type qualifiers only to types that can
712   /// have qualifiers, and silently suppresses those qualifiers that are not
713   /// permitted. Subclasses may override this routine to provide different
714   /// behavior.
715   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
716
717   /// Build a new pointer type given its pointee type.
718   ///
719   /// By default, performs semantic analysis when building the pointer type.
720   /// Subclasses may override this routine to provide different behavior.
721   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
722
723   /// Build a new block pointer type given its pointee type.
724   ///
725   /// By default, performs semantic analysis when building the block pointer
726   /// type. Subclasses may override this routine to provide different behavior.
727   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
728
729   /// Build a new reference type given the type it references.
730   ///
731   /// By default, performs semantic analysis when building the
732   /// reference type. Subclasses may override this routine to provide
733   /// different behavior.
734   ///
735   /// \param LValue whether the type was written with an lvalue sigil
736   /// or an rvalue sigil.
737   QualType RebuildReferenceType(QualType ReferentType,
738                                 bool LValue,
739                                 SourceLocation Sigil);
740
741   /// Build a new member pointer type given the pointee type and the
742   /// class type it refers into.
743   ///
744   /// By default, performs semantic analysis when building the member pointer
745   /// type. Subclasses may override this routine to provide different behavior.
746   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
747                                     SourceLocation Sigil);
748
749   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
750                                     SourceLocation ProtocolLAngleLoc,
751                                     ArrayRef<ObjCProtocolDecl *> Protocols,
752                                     ArrayRef<SourceLocation> ProtocolLocs,
753                                     SourceLocation ProtocolRAngleLoc);
754
755   /// Build an Objective-C object type.
756   ///
757   /// By default, performs semantic analysis when building the object type.
758   /// Subclasses may override this routine to provide different behavior.
759   QualType RebuildObjCObjectType(QualType BaseType,
760                                  SourceLocation Loc,
761                                  SourceLocation TypeArgsLAngleLoc,
762                                  ArrayRef<TypeSourceInfo *> TypeArgs,
763                                  SourceLocation TypeArgsRAngleLoc,
764                                  SourceLocation ProtocolLAngleLoc,
765                                  ArrayRef<ObjCProtocolDecl *> Protocols,
766                                  ArrayRef<SourceLocation> ProtocolLocs,
767                                  SourceLocation ProtocolRAngleLoc);
768
769   /// Build a new Objective-C object pointer type given the pointee type.
770   ///
771   /// By default, directly builds the pointer type, with no additional semantic
772   /// analysis.
773   QualType RebuildObjCObjectPointerType(QualType PointeeType,
774                                         SourceLocation Star);
775
776   /// Build a new array type given the element type, size
777   /// modifier, size of the array (if known), size expression, and index type
778   /// qualifiers.
779   ///
780   /// By default, performs semantic analysis when building the array type.
781   /// Subclasses may override this routine to provide different behavior.
782   /// Also by default, all of the other Rebuild*Array
783   QualType RebuildArrayType(QualType ElementType,
784                             ArrayType::ArraySizeModifier SizeMod,
785                             const llvm::APInt *Size,
786                             Expr *SizeExpr,
787                             unsigned IndexTypeQuals,
788                             SourceRange BracketsRange);
789
790   /// Build a new constant array type given the element type, size
791   /// modifier, (known) size of the array, and index type qualifiers.
792   ///
793   /// By default, performs semantic analysis when building the array type.
794   /// Subclasses may override this routine to provide different behavior.
795   QualType RebuildConstantArrayType(QualType ElementType,
796                                     ArrayType::ArraySizeModifier SizeMod,
797                                     const llvm::APInt &Size,
798                                     unsigned IndexTypeQuals,
799                                     SourceRange BracketsRange);
800
801   /// Build a new incomplete array type given the element type, size
802   /// modifier, and index type qualifiers.
803   ///
804   /// By default, performs semantic analysis when building the array type.
805   /// Subclasses may override this routine to provide different behavior.
806   QualType RebuildIncompleteArrayType(QualType ElementType,
807                                       ArrayType::ArraySizeModifier SizeMod,
808                                       unsigned IndexTypeQuals,
809                                       SourceRange BracketsRange);
810
811   /// Build a new variable-length array type given the element type,
812   /// size modifier, size expression, and index type qualifiers.
813   ///
814   /// By default, performs semantic analysis when building the array type.
815   /// Subclasses may override this routine to provide different behavior.
816   QualType RebuildVariableArrayType(QualType ElementType,
817                                     ArrayType::ArraySizeModifier SizeMod,
818                                     Expr *SizeExpr,
819                                     unsigned IndexTypeQuals,
820                                     SourceRange BracketsRange);
821
822   /// Build a new dependent-sized array type given the element type,
823   /// size modifier, size expression, and index type qualifiers.
824   ///
825   /// By default, performs semantic analysis when building the array type.
826   /// Subclasses may override this routine to provide different behavior.
827   QualType RebuildDependentSizedArrayType(QualType ElementType,
828                                           ArrayType::ArraySizeModifier SizeMod,
829                                           Expr *SizeExpr,
830                                           unsigned IndexTypeQuals,
831                                           SourceRange BracketsRange);
832
833   /// Build a new vector type given the element type and
834   /// number of elements.
835   ///
836   /// By default, performs semantic analysis when building the vector type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
839                              VectorType::VectorKind VecKind);
840
841   /// Build a new potentially dependently-sized extended vector type
842   /// given the element type and number of elements.
843   ///
844   /// By default, performs semantic analysis when building the vector type.
845   /// Subclasses may override this routine to provide different behavior.
846   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
847                                            SourceLocation AttributeLoc,
848                                            VectorType::VectorKind);
849
850   /// Build a new extended vector type given the element type and
851   /// number of elements.
852   ///
853   /// By default, performs semantic analysis when building the vector type.
854   /// Subclasses may override this routine to provide different behavior.
855   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
856                                 SourceLocation AttributeLoc);
857
858   /// Build a new potentially dependently-sized extended vector type
859   /// given the element type and number of elements.
860   ///
861   /// By default, performs semantic analysis when building the vector type.
862   /// Subclasses may override this routine to provide different behavior.
863   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
864                                               Expr *SizeExpr,
865                                               SourceLocation AttributeLoc);
866
867   /// Build a new DependentAddressSpaceType or return the pointee
868   /// type variable with the correct address space (retrieved from
869   /// AddrSpaceExpr) applied to it. The former will be returned in cases
870   /// where the address space remains dependent.
871   ///
872   /// By default, performs semantic analysis when building the type with address
873   /// space applied. Subclasses may override this routine to provide different
874   /// behavior.
875   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
876                                             Expr *AddrSpaceExpr,
877                                             SourceLocation AttributeLoc);
878
879   /// Build a new function type.
880   ///
881   /// By default, performs semantic analysis when building the function type.
882   /// Subclasses may override this routine to provide different behavior.
883   QualType RebuildFunctionProtoType(QualType T,
884                                     MutableArrayRef<QualType> ParamTypes,
885                                     const FunctionProtoType::ExtProtoInfo &EPI);
886
887   /// Build a new unprototyped function type.
888   QualType RebuildFunctionNoProtoType(QualType ResultType);
889
890   /// Rebuild an unresolved typename type, given the decl that
891   /// the UnresolvedUsingTypenameDecl was transformed to.
892   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
893
894   /// Build a new typedef type.
895   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
896     return SemaRef.Context.getTypeDeclType(Typedef);
897   }
898
899   /// Build a new MacroDefined type.
900   QualType RebuildMacroQualifiedType(QualType T,
901                                      const IdentifierInfo *MacroII) {
902     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
903   }
904
905   /// Build a new class/struct/union type.
906   QualType RebuildRecordType(RecordDecl *Record) {
907     return SemaRef.Context.getTypeDeclType(Record);
908   }
909
910   /// Build a new Enum type.
911   QualType RebuildEnumType(EnumDecl *Enum) {
912     return SemaRef.Context.getTypeDeclType(Enum);
913   }
914
915   /// Build a new typeof(expr) type.
916   ///
917   /// By default, performs semantic analysis when building the typeof type.
918   /// Subclasses may override this routine to provide different behavior.
919   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
920
921   /// Build a new typeof(type) type.
922   ///
923   /// By default, builds a new TypeOfType with the given underlying type.
924   QualType RebuildTypeOfType(QualType Underlying);
925
926   /// Build a new unary transform type.
927   QualType RebuildUnaryTransformType(QualType BaseType,
928                                      UnaryTransformType::UTTKind UKind,
929                                      SourceLocation Loc);
930
931   /// Build a new C++11 decltype type.
932   ///
933   /// By default, performs semantic analysis when building the decltype type.
934   /// Subclasses may override this routine to provide different behavior.
935   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
936
937   /// Build a new C++11 auto type.
938   ///
939   /// By default, builds a new AutoType with the given deduced type.
940   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
941     // Note, IsDependent is always false here: we implicitly convert an 'auto'
942     // which has been deduced to a dependent type into an undeduced 'auto', so
943     // that we'll retry deduction after the transformation.
944     return SemaRef.Context.getAutoType(Deduced, Keyword,
945                                        /*IsDependent*/ false);
946   }
947
948   /// By default, builds a new DeducedTemplateSpecializationType with the given
949   /// deduced type.
950   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
951       QualType Deduced) {
952     return SemaRef.Context.getDeducedTemplateSpecializationType(
953         Template, Deduced, /*IsDependent*/ false);
954   }
955
956   /// Build a new template specialization type.
957   ///
958   /// By default, performs semantic analysis when building the template
959   /// specialization type. Subclasses may override this routine to provide
960   /// different behavior.
961   QualType RebuildTemplateSpecializationType(TemplateName Template,
962                                              SourceLocation TemplateLoc,
963                                              TemplateArgumentListInfo &Args);
964
965   /// Build a new parenthesized type.
966   ///
967   /// By default, builds a new ParenType type from the inner type.
968   /// Subclasses may override this routine to provide different behavior.
969   QualType RebuildParenType(QualType InnerType) {
970     return SemaRef.BuildParenType(InnerType);
971   }
972
973   /// Build a new qualified name type.
974   ///
975   /// By default, builds a new ElaboratedType type from the keyword,
976   /// the nested-name-specifier and the named type.
977   /// Subclasses may override this routine to provide different behavior.
978   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
979                                  ElaboratedTypeKeyword Keyword,
980                                  NestedNameSpecifierLoc QualifierLoc,
981                                  QualType Named) {
982     return SemaRef.Context.getElaboratedType(Keyword,
983                                          QualifierLoc.getNestedNameSpecifier(),
984                                              Named);
985   }
986
987   /// Build a new typename type that refers to a template-id.
988   ///
989   /// By default, builds a new DependentNameType type from the
990   /// nested-name-specifier and the given type. Subclasses may override
991   /// this routine to provide different behavior.
992   QualType RebuildDependentTemplateSpecializationType(
993                                           ElaboratedTypeKeyword Keyword,
994                                           NestedNameSpecifierLoc QualifierLoc,
995                                           SourceLocation TemplateKWLoc,
996                                           const IdentifierInfo *Name,
997                                           SourceLocation NameLoc,
998                                           TemplateArgumentListInfo &Args,
999                                           bool AllowInjectedClassName) {
1000     // Rebuild the template name.
1001     // TODO: avoid TemplateName abstraction
1002     CXXScopeSpec SS;
1003     SS.Adopt(QualifierLoc);
1004     TemplateName InstName = getDerived().RebuildTemplateName(
1005         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1006         AllowInjectedClassName);
1007
1008     if (InstName.isNull())
1009       return QualType();
1010
1011     // If it's still dependent, make a dependent specialization.
1012     if (InstName.getAsDependentTemplateName())
1013       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1014                                           QualifierLoc.getNestedNameSpecifier(),
1015                                                                     Name,
1016                                                                     Args);
1017
1018     // Otherwise, make an elaborated type wrapping a non-dependent
1019     // specialization.
1020     QualType T =
1021     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1022     if (T.isNull()) return QualType();
1023
1024     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1025       return T;
1026
1027     return SemaRef.Context.getElaboratedType(Keyword,
1028                                        QualifierLoc.getNestedNameSpecifier(),
1029                                              T);
1030   }
1031
1032   /// Build a new typename type that refers to an identifier.
1033   ///
1034   /// By default, performs semantic analysis when building the typename type
1035   /// (or elaborated type). Subclasses may override this routine to provide
1036   /// different behavior.
1037   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1038                                     SourceLocation KeywordLoc,
1039                                     NestedNameSpecifierLoc QualifierLoc,
1040                                     const IdentifierInfo *Id,
1041                                     SourceLocation IdLoc,
1042                                     bool DeducedTSTContext) {
1043     CXXScopeSpec SS;
1044     SS.Adopt(QualifierLoc);
1045
1046     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1047       // If the name is still dependent, just build a new dependent name type.
1048       if (!SemaRef.computeDeclContext(SS))
1049         return SemaRef.Context.getDependentNameType(Keyword,
1050                                           QualifierLoc.getNestedNameSpecifier(),
1051                                                     Id);
1052     }
1053
1054     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1055       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1056                                              *Id, IdLoc);
1057       // If a dependent name resolves to a deduced template specialization type,
1058       // check that we're in one of the syntactic contexts permitting it.
1059       if (!DeducedTSTContext) {
1060         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1061                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1062           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1063             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1064                    Deduced->getTemplateName())
1065             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1066           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1067             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1068           return QualType();
1069         }
1070       }
1071       return T;
1072     }
1073
1074     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1075
1076     // We had a dependent elaborated-type-specifier that has been transformed
1077     // into a non-dependent elaborated-type-specifier. Find the tag we're
1078     // referring to.
1079     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1080     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1081     if (!DC)
1082       return QualType();
1083
1084     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1085       return QualType();
1086
1087     TagDecl *Tag = nullptr;
1088     SemaRef.LookupQualifiedName(Result, DC);
1089     switch (Result.getResultKind()) {
1090       case LookupResult::NotFound:
1091       case LookupResult::NotFoundInCurrentInstantiation:
1092         break;
1093
1094       case LookupResult::Found:
1095         Tag = Result.getAsSingle<TagDecl>();
1096         break;
1097
1098       case LookupResult::FoundOverloaded:
1099       case LookupResult::FoundUnresolvedValue:
1100         llvm_unreachable("Tag lookup cannot find non-tags");
1101
1102       case LookupResult::Ambiguous:
1103         // Let the LookupResult structure handle ambiguities.
1104         return QualType();
1105     }
1106
1107     if (!Tag) {
1108       // Check where the name exists but isn't a tag type and use that to emit
1109       // better diagnostics.
1110       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111       SemaRef.LookupQualifiedName(Result, DC);
1112       switch (Result.getResultKind()) {
1113         case LookupResult::Found:
1114         case LookupResult::FoundOverloaded:
1115         case LookupResult::FoundUnresolvedValue: {
1116           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1117           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1118           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1119                                                                << NTK << Kind;
1120           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1121           break;
1122         }
1123         default:
1124           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1125               << Kind << Id << DC << QualifierLoc.getSourceRange();
1126           break;
1127       }
1128       return QualType();
1129     }
1130
1131     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1132                                               IdLoc, Id)) {
1133       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1134       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1135       return QualType();
1136     }
1137
1138     // Build the elaborated-type-specifier type.
1139     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1140     return SemaRef.Context.getElaboratedType(Keyword,
1141                                          QualifierLoc.getNestedNameSpecifier(),
1142                                              T);
1143   }
1144
1145   /// Build a new pack expansion type.
1146   ///
1147   /// By default, builds a new PackExpansionType type from the given pattern.
1148   /// Subclasses may override this routine to provide different behavior.
1149   QualType RebuildPackExpansionType(QualType Pattern,
1150                                     SourceRange PatternRange,
1151                                     SourceLocation EllipsisLoc,
1152                                     Optional<unsigned> NumExpansions) {
1153     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1154                                         NumExpansions);
1155   }
1156
1157   /// Build a new atomic type given its value type.
1158   ///
1159   /// By default, performs semantic analysis when building the atomic type.
1160   /// Subclasses may override this routine to provide different behavior.
1161   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1162
1163   /// Build a new pipe type given its value type.
1164   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1165                            bool isReadPipe);
1166
1167   /// Build a new template name given a nested name specifier, a flag
1168   /// indicating whether the "template" keyword was provided, and the template
1169   /// that the template name refers to.
1170   ///
1171   /// By default, builds the new template name directly. Subclasses may override
1172   /// this routine to provide different behavior.
1173   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1174                                    bool TemplateKW,
1175                                    TemplateDecl *Template);
1176
1177   /// Build a new template name given a nested name specifier and the
1178   /// name that is referred to as a template.
1179   ///
1180   /// By default, performs semantic analysis to determine whether the name can
1181   /// be resolved to a specific template, then builds the appropriate kind of
1182   /// template name. Subclasses may override this routine to provide different
1183   /// behavior.
1184   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1185                                    SourceLocation TemplateKWLoc,
1186                                    const IdentifierInfo &Name,
1187                                    SourceLocation NameLoc, QualType ObjectType,
1188                                    NamedDecl *FirstQualifierInScope,
1189                                    bool AllowInjectedClassName);
1190
1191   /// Build a new template name given a nested name specifier and the
1192   /// overloaded operator name that is referred to as a template.
1193   ///
1194   /// By default, performs semantic analysis to determine whether the name can
1195   /// be resolved to a specific template, then builds the appropriate kind of
1196   /// template name. Subclasses may override this routine to provide different
1197   /// behavior.
1198   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1199                                    SourceLocation TemplateKWLoc,
1200                                    OverloadedOperatorKind Operator,
1201                                    SourceLocation NameLoc, QualType ObjectType,
1202                                    bool AllowInjectedClassName);
1203
1204   /// Build a new template name given a template template parameter pack
1205   /// and the
1206   ///
1207   /// By default, performs semantic analysis to determine whether the name can
1208   /// be resolved to a specific template, then builds the appropriate kind of
1209   /// template name. Subclasses may override this routine to provide different
1210   /// behavior.
1211   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1212                                    const TemplateArgument &ArgPack) {
1213     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1214   }
1215
1216   /// Build a new compound statement.
1217   ///
1218   /// By default, performs semantic analysis to build the new statement.
1219   /// Subclasses may override this routine to provide different behavior.
1220   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1221                                        MultiStmtArg Statements,
1222                                        SourceLocation RBraceLoc,
1223                                        bool IsStmtExpr) {
1224     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1225                                        IsStmtExpr);
1226   }
1227
1228   /// Build a new case statement.
1229   ///
1230   /// By default, performs semantic analysis to build the new statement.
1231   /// Subclasses may override this routine to provide different behavior.
1232   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1233                                    Expr *LHS,
1234                                    SourceLocation EllipsisLoc,
1235                                    Expr *RHS,
1236                                    SourceLocation ColonLoc) {
1237     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1238                                    ColonLoc);
1239   }
1240
1241   /// Attach the body to a new case statement.
1242   ///
1243   /// By default, performs semantic analysis to build the new statement.
1244   /// Subclasses may override this routine to provide different behavior.
1245   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1246     getSema().ActOnCaseStmtBody(S, Body);
1247     return S;
1248   }
1249
1250   /// Build a new default statement.
1251   ///
1252   /// By default, performs semantic analysis to build the new statement.
1253   /// Subclasses may override this routine to provide different behavior.
1254   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1255                                       SourceLocation ColonLoc,
1256                                       Stmt *SubStmt) {
1257     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1258                                       /*CurScope=*/nullptr);
1259   }
1260
1261   /// Build a new label statement.
1262   ///
1263   /// By default, performs semantic analysis to build the new statement.
1264   /// Subclasses may override this routine to provide different behavior.
1265   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1266                               SourceLocation ColonLoc, Stmt *SubStmt) {
1267     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1268   }
1269
1270   /// Build a new label statement.
1271   ///
1272   /// By default, performs semantic analysis to build the new statement.
1273   /// Subclasses may override this routine to provide different behavior.
1274   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1275                                    ArrayRef<const Attr*> Attrs,
1276                                    Stmt *SubStmt) {
1277     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1278   }
1279
1280   /// Build a new "if" statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1285                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1286                            SourceLocation ElseLoc, Stmt *Else) {
1287     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1288                                  ElseLoc, Else);
1289   }
1290
1291   /// Start building a new switch statement.
1292   ///
1293   /// By default, performs semantic analysis to build the new statement.
1294   /// Subclasses may override this routine to provide different behavior.
1295   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1296                                     Sema::ConditionResult Cond) {
1297     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1298   }
1299
1300   /// Attach the body to the switch statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1305                                    Stmt *Switch, Stmt *Body) {
1306     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1307   }
1308
1309   /// Build a new while statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1314                               Sema::ConditionResult Cond, Stmt *Body) {
1315     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1316   }
1317
1318   /// Build a new do-while statement.
1319   ///
1320   /// By default, performs semantic analysis to build the new statement.
1321   /// Subclasses may override this routine to provide different behavior.
1322   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1323                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1324                            Expr *Cond, SourceLocation RParenLoc) {
1325     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1326                                  Cond, RParenLoc);
1327   }
1328
1329   /// Build a new for statement.
1330   ///
1331   /// By default, performs semantic analysis to build the new statement.
1332   /// Subclasses may override this routine to provide different behavior.
1333   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1334                             Stmt *Init, Sema::ConditionResult Cond,
1335                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1336                             Stmt *Body) {
1337     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1338                                   Inc, RParenLoc, Body);
1339   }
1340
1341   /// Build a new goto statement.
1342   ///
1343   /// By default, performs semantic analysis to build the new statement.
1344   /// Subclasses may override this routine to provide different behavior.
1345   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1346                              LabelDecl *Label) {
1347     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1348   }
1349
1350   /// Build a new indirect goto statement.
1351   ///
1352   /// By default, performs semantic analysis to build the new statement.
1353   /// Subclasses may override this routine to provide different behavior.
1354   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1355                                      SourceLocation StarLoc,
1356                                      Expr *Target) {
1357     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1358   }
1359
1360   /// Build a new return statement.
1361   ///
1362   /// By default, performs semantic analysis to build the new statement.
1363   /// Subclasses may override this routine to provide different behavior.
1364   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1365     return getSema().BuildReturnStmt(ReturnLoc, Result);
1366   }
1367
1368   /// Build a new declaration statement.
1369   ///
1370   /// By default, performs semantic analysis to build the new statement.
1371   /// Subclasses may override this routine to provide different behavior.
1372   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1373                              SourceLocation StartLoc, SourceLocation EndLoc) {
1374     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1375     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1376   }
1377
1378   /// Build a new inline asm statement.
1379   ///
1380   /// By default, performs semantic analysis to build the new statement.
1381   /// Subclasses may override this routine to provide different behavior.
1382   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1383                                bool IsVolatile, unsigned NumOutputs,
1384                                unsigned NumInputs, IdentifierInfo **Names,
1385                                MultiExprArg Constraints, MultiExprArg Exprs,
1386                                Expr *AsmString, MultiExprArg Clobbers,
1387                                unsigned NumLabels,
1388                                SourceLocation RParenLoc) {
1389     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1390                                      NumInputs, Names, Constraints, Exprs,
1391                                      AsmString, Clobbers, NumLabels, RParenLoc);
1392   }
1393
1394   /// Build a new MS style inline asm statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1399                               ArrayRef<Token> AsmToks,
1400                               StringRef AsmString,
1401                               unsigned NumOutputs, unsigned NumInputs,
1402                               ArrayRef<StringRef> Constraints,
1403                               ArrayRef<StringRef> Clobbers,
1404                               ArrayRef<Expr*> Exprs,
1405                               SourceLocation EndLoc) {
1406     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1407                                     NumOutputs, NumInputs,
1408                                     Constraints, Clobbers, Exprs, EndLoc);
1409   }
1410
1411   /// Build a new co_return statement.
1412   ///
1413   /// By default, performs semantic analysis to build the new statement.
1414   /// Subclasses may override this routine to provide different behavior.
1415   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1416                                  bool IsImplicit) {
1417     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1418   }
1419
1420   /// Build a new co_await expression.
1421   ///
1422   /// By default, performs semantic analysis to build the new expression.
1423   /// Subclasses may override this routine to provide different behavior.
1424   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1425                                 bool IsImplicit) {
1426     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1427   }
1428
1429   /// Build a new co_await expression.
1430   ///
1431   /// By default, performs semantic analysis to build the new expression.
1432   /// Subclasses may override this routine to provide different behavior.
1433   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1434                                          Expr *Result,
1435                                          UnresolvedLookupExpr *Lookup) {
1436     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1437   }
1438
1439   /// Build a new co_yield expression.
1440   ///
1441   /// By default, performs semantic analysis to build the new expression.
1442   /// Subclasses may override this routine to provide different behavior.
1443   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1444     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1445   }
1446
1447   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1448     return getSema().BuildCoroutineBodyStmt(Args);
1449   }
1450
1451   /// Build a new Objective-C \@try statement.
1452   ///
1453   /// By default, performs semantic analysis to build the new statement.
1454   /// Subclasses may override this routine to provide different behavior.
1455   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1456                                         Stmt *TryBody,
1457                                         MultiStmtArg CatchStmts,
1458                                         Stmt *Finally) {
1459     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1460                                         Finally);
1461   }
1462
1463   /// Rebuild an Objective-C exception declaration.
1464   ///
1465   /// By default, performs semantic analysis to build the new declaration.
1466   /// Subclasses may override this routine to provide different behavior.
1467   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1468                                     TypeSourceInfo *TInfo, QualType T) {
1469     return getSema().BuildObjCExceptionDecl(TInfo, T,
1470                                             ExceptionDecl->getInnerLocStart(),
1471                                             ExceptionDecl->getLocation(),
1472                                             ExceptionDecl->getIdentifier());
1473   }
1474
1475   /// Build a new Objective-C \@catch statement.
1476   ///
1477   /// By default, performs semantic analysis to build the new statement.
1478   /// Subclasses may override this routine to provide different behavior.
1479   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1480                                           SourceLocation RParenLoc,
1481                                           VarDecl *Var,
1482                                           Stmt *Body) {
1483     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1484                                           Var, Body);
1485   }
1486
1487   /// Build a new Objective-C \@finally statement.
1488   ///
1489   /// By default, performs semantic analysis to build the new statement.
1490   /// Subclasses may override this routine to provide different behavior.
1491   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1492                                             Stmt *Body) {
1493     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1494   }
1495
1496   /// Build a new Objective-C \@throw statement.
1497   ///
1498   /// By default, performs semantic analysis to build the new statement.
1499   /// Subclasses may override this routine to provide different behavior.
1500   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1501                                           Expr *Operand) {
1502     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1503   }
1504
1505   /// Build a new OpenMP executable directive.
1506   ///
1507   /// By default, performs semantic analysis to build the new statement.
1508   /// Subclasses may override this routine to provide different behavior.
1509   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1510                                            DeclarationNameInfo DirName,
1511                                            OpenMPDirectiveKind CancelRegion,
1512                                            ArrayRef<OMPClause *> Clauses,
1513                                            Stmt *AStmt, SourceLocation StartLoc,
1514                                            SourceLocation EndLoc) {
1515     return getSema().ActOnOpenMPExecutableDirective(
1516         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1517   }
1518
1519   /// Build a new OpenMP 'if' clause.
1520   ///
1521   /// By default, performs semantic analysis to build the new OpenMP clause.
1522   /// Subclasses may override this routine to provide different behavior.
1523   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1524                                 Expr *Condition, SourceLocation StartLoc,
1525                                 SourceLocation LParenLoc,
1526                                 SourceLocation NameModifierLoc,
1527                                 SourceLocation ColonLoc,
1528                                 SourceLocation EndLoc) {
1529     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1530                                          LParenLoc, NameModifierLoc, ColonLoc,
1531                                          EndLoc);
1532   }
1533
1534   /// Build a new OpenMP 'final' clause.
1535   ///
1536   /// By default, performs semantic analysis to build the new OpenMP clause.
1537   /// Subclasses may override this routine to provide different behavior.
1538   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1539                                    SourceLocation LParenLoc,
1540                                    SourceLocation EndLoc) {
1541     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1542                                             EndLoc);
1543   }
1544
1545   /// Build a new OpenMP 'num_threads' clause.
1546   ///
1547   /// By default, performs semantic analysis to build the new OpenMP clause.
1548   /// Subclasses may override this routine to provide different behavior.
1549   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1550                                         SourceLocation StartLoc,
1551                                         SourceLocation LParenLoc,
1552                                         SourceLocation EndLoc) {
1553     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1554                                                  LParenLoc, EndLoc);
1555   }
1556
1557   /// Build a new OpenMP 'safelen' clause.
1558   ///
1559   /// By default, performs semantic analysis to build the new OpenMP clause.
1560   /// Subclasses may override this routine to provide different behavior.
1561   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1562                                      SourceLocation LParenLoc,
1563                                      SourceLocation EndLoc) {
1564     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1565   }
1566
1567   /// Build a new OpenMP 'simdlen' clause.
1568   ///
1569   /// By default, performs semantic analysis to build the new OpenMP clause.
1570   /// Subclasses may override this routine to provide different behavior.
1571   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1572                                      SourceLocation LParenLoc,
1573                                      SourceLocation EndLoc) {
1574     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1575   }
1576
1577   /// Build a new OpenMP 'allocator' clause.
1578   ///
1579   /// By default, performs semantic analysis to build the new OpenMP clause.
1580   /// Subclasses may override this routine to provide different behavior.
1581   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1582                                        SourceLocation LParenLoc,
1583                                        SourceLocation EndLoc) {
1584     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1585   }
1586
1587   /// Build a new OpenMP 'collapse' clause.
1588   ///
1589   /// By default, performs semantic analysis to build the new OpenMP clause.
1590   /// Subclasses may override this routine to provide different behavior.
1591   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1592                                       SourceLocation LParenLoc,
1593                                       SourceLocation EndLoc) {
1594     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1595                                                EndLoc);
1596   }
1597
1598   /// Build a new OpenMP 'default' clause.
1599   ///
1600   /// By default, performs semantic analysis to build the new OpenMP clause.
1601   /// Subclasses may override this routine to provide different behavior.
1602   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1603                                      SourceLocation KindKwLoc,
1604                                      SourceLocation StartLoc,
1605                                      SourceLocation LParenLoc,
1606                                      SourceLocation EndLoc) {
1607     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1608                                               StartLoc, LParenLoc, EndLoc);
1609   }
1610
1611   /// Build a new OpenMP 'proc_bind' clause.
1612   ///
1613   /// By default, performs semantic analysis to build the new OpenMP clause.
1614   /// Subclasses may override this routine to provide different behavior.
1615   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1616                                       SourceLocation KindKwLoc,
1617                                       SourceLocation StartLoc,
1618                                       SourceLocation LParenLoc,
1619                                       SourceLocation EndLoc) {
1620     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1621                                                StartLoc, LParenLoc, EndLoc);
1622   }
1623
1624   /// Build a new OpenMP 'schedule' clause.
1625   ///
1626   /// By default, performs semantic analysis to build the new OpenMP clause.
1627   /// Subclasses may override this routine to provide different behavior.
1628   OMPClause *RebuildOMPScheduleClause(
1629       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1630       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1631       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1632       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPScheduleClause(
1634         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1635         CommaLoc, EndLoc);
1636   }
1637
1638   /// Build a new OpenMP 'ordered' clause.
1639   ///
1640   /// By default, performs semantic analysis to build the new OpenMP clause.
1641   /// Subclasses may override this routine to provide different behavior.
1642   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1643                                      SourceLocation EndLoc,
1644                                      SourceLocation LParenLoc, Expr *Num) {
1645     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1646   }
1647
1648   /// Build a new OpenMP 'private' clause.
1649   ///
1650   /// By default, performs semantic analysis to build the new OpenMP clause.
1651   /// Subclasses may override this routine to provide different behavior.
1652   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1653                                      SourceLocation StartLoc,
1654                                      SourceLocation LParenLoc,
1655                                      SourceLocation EndLoc) {
1656     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1657                                               EndLoc);
1658   }
1659
1660   /// Build a new OpenMP 'firstprivate' clause.
1661   ///
1662   /// By default, performs semantic analysis to build the new OpenMP clause.
1663   /// Subclasses may override this routine to provide different behavior.
1664   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1665                                           SourceLocation StartLoc,
1666                                           SourceLocation LParenLoc,
1667                                           SourceLocation EndLoc) {
1668     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1669                                                    EndLoc);
1670   }
1671
1672   /// Build a new OpenMP 'lastprivate' clause.
1673   ///
1674   /// By default, performs semantic analysis to build the new OpenMP clause.
1675   /// Subclasses may override this routine to provide different behavior.
1676   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1677                                          SourceLocation StartLoc,
1678                                          SourceLocation LParenLoc,
1679                                          SourceLocation EndLoc) {
1680     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1681                                                   EndLoc);
1682   }
1683
1684   /// Build a new OpenMP 'shared' clause.
1685   ///
1686   /// By default, performs semantic analysis to build the new OpenMP clause.
1687   /// Subclasses may override this routine to provide different behavior.
1688   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1689                                     SourceLocation StartLoc,
1690                                     SourceLocation LParenLoc,
1691                                     SourceLocation EndLoc) {
1692     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1693                                              EndLoc);
1694   }
1695
1696   /// Build a new OpenMP 'reduction' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new statement.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1701                                        SourceLocation StartLoc,
1702                                        SourceLocation LParenLoc,
1703                                        SourceLocation ColonLoc,
1704                                        SourceLocation EndLoc,
1705                                        CXXScopeSpec &ReductionIdScopeSpec,
1706                                        const DeclarationNameInfo &ReductionId,
1707                                        ArrayRef<Expr *> UnresolvedReductions) {
1708     return getSema().ActOnOpenMPReductionClause(
1709         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1710         ReductionId, UnresolvedReductions);
1711   }
1712
1713   /// Build a new OpenMP 'task_reduction' clause.
1714   ///
1715   /// By default, performs semantic analysis to build the new statement.
1716   /// Subclasses may override this routine to provide different behavior.
1717   OMPClause *RebuildOMPTaskReductionClause(
1718       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1719       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1720       CXXScopeSpec &ReductionIdScopeSpec,
1721       const DeclarationNameInfo &ReductionId,
1722       ArrayRef<Expr *> UnresolvedReductions) {
1723     return getSema().ActOnOpenMPTaskReductionClause(
1724         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1725         ReductionId, UnresolvedReductions);
1726   }
1727
1728   /// Build a new OpenMP 'in_reduction' clause.
1729   ///
1730   /// By default, performs semantic analysis to build the new statement.
1731   /// Subclasses may override this routine to provide different behavior.
1732   OMPClause *
1733   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1734                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1735                               SourceLocation EndLoc,
1736                               CXXScopeSpec &ReductionIdScopeSpec,
1737                               const DeclarationNameInfo &ReductionId,
1738                               ArrayRef<Expr *> UnresolvedReductions) {
1739     return getSema().ActOnOpenMPInReductionClause(
1740         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1741         ReductionId, UnresolvedReductions);
1742   }
1743
1744   /// Build a new OpenMP 'linear' clause.
1745   ///
1746   /// By default, performs semantic analysis to build the new OpenMP clause.
1747   /// Subclasses may override this routine to provide different behavior.
1748   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1749                                     SourceLocation StartLoc,
1750                                     SourceLocation LParenLoc,
1751                                     OpenMPLinearClauseKind Modifier,
1752                                     SourceLocation ModifierLoc,
1753                                     SourceLocation ColonLoc,
1754                                     SourceLocation EndLoc) {
1755     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1756                                              Modifier, ModifierLoc, ColonLoc,
1757                                              EndLoc);
1758   }
1759
1760   /// Build a new OpenMP 'aligned' clause.
1761   ///
1762   /// By default, performs semantic analysis to build the new OpenMP clause.
1763   /// Subclasses may override this routine to provide different behavior.
1764   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1765                                      SourceLocation StartLoc,
1766                                      SourceLocation LParenLoc,
1767                                      SourceLocation ColonLoc,
1768                                      SourceLocation EndLoc) {
1769     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1770                                               LParenLoc, ColonLoc, EndLoc);
1771   }
1772
1773   /// Build a new OpenMP 'copyin' clause.
1774   ///
1775   /// By default, performs semantic analysis to build the new OpenMP clause.
1776   /// Subclasses may override this routine to provide different behavior.
1777   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1778                                     SourceLocation StartLoc,
1779                                     SourceLocation LParenLoc,
1780                                     SourceLocation EndLoc) {
1781     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1782                                              EndLoc);
1783   }
1784
1785   /// Build a new OpenMP 'copyprivate' clause.
1786   ///
1787   /// By default, performs semantic analysis to build the new OpenMP clause.
1788   /// Subclasses may override this routine to provide different behavior.
1789   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1790                                          SourceLocation StartLoc,
1791                                          SourceLocation LParenLoc,
1792                                          SourceLocation EndLoc) {
1793     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1794                                                   EndLoc);
1795   }
1796
1797   /// Build a new OpenMP 'flush' pseudo clause.
1798   ///
1799   /// By default, performs semantic analysis to build the new OpenMP clause.
1800   /// Subclasses may override this routine to provide different behavior.
1801   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1802                                    SourceLocation StartLoc,
1803                                    SourceLocation LParenLoc,
1804                                    SourceLocation EndLoc) {
1805     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1806                                             EndLoc);
1807   }
1808
1809   /// Build a new OpenMP 'depend' pseudo clause.
1810   ///
1811   /// By default, performs semantic analysis to build the new OpenMP clause.
1812   /// Subclasses may override this routine to provide different behavior.
1813   OMPClause *
1814   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1815                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1816                          SourceLocation StartLoc, SourceLocation LParenLoc,
1817                          SourceLocation EndLoc) {
1818     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1819                                              StartLoc, LParenLoc, EndLoc);
1820   }
1821
1822   /// Build a new OpenMP 'device' clause.
1823   ///
1824   /// By default, performs semantic analysis to build the new statement.
1825   /// Subclasses may override this routine to provide different behavior.
1826   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1827                                     SourceLocation LParenLoc,
1828                                     SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1830                                              EndLoc);
1831   }
1832
1833   /// Build a new OpenMP 'map' clause.
1834   ///
1835   /// By default, performs semantic analysis to build the new OpenMP clause.
1836   /// Subclasses may override this routine to provide different behavior.
1837   OMPClause *RebuildOMPMapClause(
1838       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1839       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1840       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1841       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1842       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1843       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1844     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1845                                           MapperIdScopeSpec, MapperId, MapType,
1846                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1847                                           VarList, Locs, UnresolvedMappers);
1848   }
1849
1850   /// Build a new OpenMP 'allocate' clause.
1851   ///
1852   /// By default, performs semantic analysis to build the new OpenMP clause.
1853   /// Subclasses may override this routine to provide different behavior.
1854   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1855                                       SourceLocation StartLoc,
1856                                       SourceLocation LParenLoc,
1857                                       SourceLocation ColonLoc,
1858                                       SourceLocation EndLoc) {
1859     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1860                                                LParenLoc, ColonLoc, EndLoc);
1861   }
1862
1863   /// Build a new OpenMP 'num_teams' clause.
1864   ///
1865   /// By default, performs semantic analysis to build the new statement.
1866   /// Subclasses may override this routine to provide different behavior.
1867   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1868                                       SourceLocation LParenLoc,
1869                                       SourceLocation EndLoc) {
1870     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1871                                                EndLoc);
1872   }
1873
1874   /// Build a new OpenMP 'thread_limit' clause.
1875   ///
1876   /// By default, performs semantic analysis to build the new statement.
1877   /// Subclasses may override this routine to provide different behavior.
1878   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1879                                          SourceLocation StartLoc,
1880                                          SourceLocation LParenLoc,
1881                                          SourceLocation EndLoc) {
1882     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1883                                                   LParenLoc, EndLoc);
1884   }
1885
1886   /// Build a new OpenMP 'priority' clause.
1887   ///
1888   /// By default, performs semantic analysis to build the new statement.
1889   /// Subclasses may override this routine to provide different behavior.
1890   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1891                                       SourceLocation LParenLoc,
1892                                       SourceLocation EndLoc) {
1893     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1894                                                EndLoc);
1895   }
1896
1897   /// Build a new OpenMP 'grainsize' clause.
1898   ///
1899   /// By default, performs semantic analysis to build the new statement.
1900   /// Subclasses may override this routine to provide different behavior.
1901   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1902                                        SourceLocation LParenLoc,
1903                                        SourceLocation EndLoc) {
1904     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1905                                                 EndLoc);
1906   }
1907
1908   /// Build a new OpenMP 'num_tasks' clause.
1909   ///
1910   /// By default, performs semantic analysis to build the new statement.
1911   /// Subclasses may override this routine to provide different behavior.
1912   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1913                                       SourceLocation LParenLoc,
1914                                       SourceLocation EndLoc) {
1915     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1916                                                EndLoc);
1917   }
1918
1919   /// Build a new OpenMP 'hint' clause.
1920   ///
1921   /// By default, performs semantic analysis to build the new statement.
1922   /// Subclasses may override this routine to provide different behavior.
1923   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1924                                   SourceLocation LParenLoc,
1925                                   SourceLocation EndLoc) {
1926     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1927   }
1928
1929   /// Build a new OpenMP 'dist_schedule' clause.
1930   ///
1931   /// By default, performs semantic analysis to build the new OpenMP clause.
1932   /// Subclasses may override this routine to provide different behavior.
1933   OMPClause *
1934   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1935                                Expr *ChunkSize, SourceLocation StartLoc,
1936                                SourceLocation LParenLoc, SourceLocation KindLoc,
1937                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1938     return getSema().ActOnOpenMPDistScheduleClause(
1939         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1940   }
1941
1942   /// Build a new OpenMP 'to' clause.
1943   ///
1944   /// By default, performs semantic analysis to build the new statement.
1945   /// Subclasses may override this routine to provide different behavior.
1946   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1947                                 CXXScopeSpec &MapperIdScopeSpec,
1948                                 DeclarationNameInfo &MapperId,
1949                                 const OMPVarListLocTy &Locs,
1950                                 ArrayRef<Expr *> UnresolvedMappers) {
1951     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1952                                          Locs, UnresolvedMappers);
1953   }
1954
1955   /// Build a new OpenMP 'from' clause.
1956   ///
1957   /// By default, performs semantic analysis to build the new statement.
1958   /// Subclasses may override this routine to provide different behavior.
1959   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1960                                   CXXScopeSpec &MapperIdScopeSpec,
1961                                   DeclarationNameInfo &MapperId,
1962                                   const OMPVarListLocTy &Locs,
1963                                   ArrayRef<Expr *> UnresolvedMappers) {
1964     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1965                                            Locs, UnresolvedMappers);
1966   }
1967
1968   /// Build a new OpenMP 'use_device_ptr' clause.
1969   ///
1970   /// By default, performs semantic analysis to build the new OpenMP clause.
1971   /// Subclasses may override this routine to provide different behavior.
1972   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1973                                           const OMPVarListLocTy &Locs) {
1974     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1975   }
1976
1977   /// Build a new OpenMP 'is_device_ptr' clause.
1978   ///
1979   /// By default, performs semantic analysis to build the new OpenMP clause.
1980   /// Subclasses may override this routine to provide different behavior.
1981   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1982                                          const OMPVarListLocTy &Locs) {
1983     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
1984   }
1985
1986   /// Rebuild the operand to an Objective-C \@synchronized statement.
1987   ///
1988   /// By default, performs semantic analysis to build the new statement.
1989   /// Subclasses may override this routine to provide different behavior.
1990   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1991                                               Expr *object) {
1992     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1993   }
1994
1995   /// Build a new Objective-C \@synchronized statement.
1996   ///
1997   /// By default, performs semantic analysis to build the new statement.
1998   /// Subclasses may override this routine to provide different behavior.
1999   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2000                                            Expr *Object, Stmt *Body) {
2001     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2002   }
2003
2004   /// Build a new Objective-C \@autoreleasepool statement.
2005   ///
2006   /// By default, performs semantic analysis to build the new statement.
2007   /// Subclasses may override this routine to provide different behavior.
2008   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2009                                             Stmt *Body) {
2010     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2011   }
2012
2013   /// Build a new Objective-C fast enumeration statement.
2014   ///
2015   /// By default, performs semantic analysis to build the new statement.
2016   /// Subclasses may override this routine to provide different behavior.
2017   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2018                                           Stmt *Element,
2019                                           Expr *Collection,
2020                                           SourceLocation RParenLoc,
2021                                           Stmt *Body) {
2022     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2023                                                 Element,
2024                                                 Collection,
2025                                                 RParenLoc);
2026     if (ForEachStmt.isInvalid())
2027       return StmtError();
2028
2029     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2030   }
2031
2032   /// Build a new C++ exception declaration.
2033   ///
2034   /// By default, performs semantic analysis to build the new decaration.
2035   /// Subclasses may override this routine to provide different behavior.
2036   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2037                                 TypeSourceInfo *Declarator,
2038                                 SourceLocation StartLoc,
2039                                 SourceLocation IdLoc,
2040                                 IdentifierInfo *Id) {
2041     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2042                                                        StartLoc, IdLoc, Id);
2043     if (Var)
2044       getSema().CurContext->addDecl(Var);
2045     return Var;
2046   }
2047
2048   /// Build a new C++ catch statement.
2049   ///
2050   /// By default, performs semantic analysis to build the new statement.
2051   /// Subclasses may override this routine to provide different behavior.
2052   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2053                                  VarDecl *ExceptionDecl,
2054                                  Stmt *Handler) {
2055     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2056                                                       Handler));
2057   }
2058
2059   /// Build a new C++ try statement.
2060   ///
2061   /// By default, performs semantic analysis to build the new statement.
2062   /// Subclasses may override this routine to provide different behavior.
2063   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2064                                ArrayRef<Stmt *> Handlers) {
2065     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2066   }
2067
2068   /// Build a new C++0x range-based for statement.
2069   ///
2070   /// By default, performs semantic analysis to build the new statement.
2071   /// Subclasses may override this routine to provide different behavior.
2072   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2073                                     SourceLocation CoawaitLoc, Stmt *Init,
2074                                     SourceLocation ColonLoc, Stmt *Range,
2075                                     Stmt *Begin, Stmt *End, Expr *Cond,
2076                                     Expr *Inc, Stmt *LoopVar,
2077                                     SourceLocation RParenLoc) {
2078     // If we've just learned that the range is actually an Objective-C
2079     // collection, treat this as an Objective-C fast enumeration loop.
2080     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2081       if (RangeStmt->isSingleDecl()) {
2082         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2083           if (RangeVar->isInvalidDecl())
2084             return StmtError();
2085
2086           Expr *RangeExpr = RangeVar->getInit();
2087           if (!RangeExpr->isTypeDependent() &&
2088               RangeExpr->getType()->isObjCObjectPointerType()) {
2089             // FIXME: Support init-statements in Objective-C++20 ranged for
2090             // statement.
2091             if (Init) {
2092               return SemaRef.Diag(Init->getBeginLoc(),
2093                                   diag::err_objc_for_range_init_stmt)
2094                          << Init->getSourceRange();
2095             }
2096             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2097                                                         RangeExpr, RParenLoc);
2098           }
2099         }
2100       }
2101     }
2102
2103     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2104                                           Range, Begin, End, Cond, Inc, LoopVar,
2105                                           RParenLoc, Sema::BFRK_Rebuild);
2106   }
2107
2108   /// Build a new C++0x range-based for statement.
2109   ///
2110   /// By default, performs semantic analysis to build the new statement.
2111   /// Subclasses may override this routine to provide different behavior.
2112   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2113                                           bool IsIfExists,
2114                                           NestedNameSpecifierLoc QualifierLoc,
2115                                           DeclarationNameInfo NameInfo,
2116                                           Stmt *Nested) {
2117     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2118                                                 QualifierLoc, NameInfo, Nested);
2119   }
2120
2121   /// Attach body to a C++0x range-based for statement.
2122   ///
2123   /// By default, performs semantic analysis to finish the new statement.
2124   /// Subclasses may override this routine to provide different behavior.
2125   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2126     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2127   }
2128
2129   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2130                                Stmt *TryBlock, Stmt *Handler) {
2131     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2132   }
2133
2134   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2135                                   Stmt *Block) {
2136     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2137   }
2138
2139   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2140     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2141   }
2142
2143   /// Build a new predefined expression.
2144   ///
2145   /// By default, performs semantic analysis to build the new expression.
2146   /// Subclasses may override this routine to provide different behavior.
2147   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2148                                    PredefinedExpr::IdentKind IK) {
2149     return getSema().BuildPredefinedExpr(Loc, IK);
2150   }
2151
2152   /// Build a new expression that references a declaration.
2153   ///
2154   /// By default, performs semantic analysis to build the new expression.
2155   /// Subclasses may override this routine to provide different behavior.
2156   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2157                                         LookupResult &R,
2158                                         bool RequiresADL) {
2159     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2160   }
2161
2162
2163   /// Build a new expression that references a declaration.
2164   ///
2165   /// By default, performs semantic analysis to build the new expression.
2166   /// Subclasses may override this routine to provide different behavior.
2167   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2168                                 ValueDecl *VD,
2169                                 const DeclarationNameInfo &NameInfo,
2170                                 TemplateArgumentListInfo *TemplateArgs) {
2171     CXXScopeSpec SS;
2172     SS.Adopt(QualifierLoc);
2173
2174     // FIXME: loses template args.
2175
2176     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2177   }
2178
2179   /// Build a new expression in parentheses.
2180   ///
2181   /// By default, performs semantic analysis to build the new expression.
2182   /// Subclasses may override this routine to provide different behavior.
2183   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2184                                     SourceLocation RParen) {
2185     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2186   }
2187
2188   /// Build a new pseudo-destructor expression.
2189   ///
2190   /// By default, performs semantic analysis to build the new expression.
2191   /// Subclasses may override this routine to provide different behavior.
2192   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2193                                             SourceLocation OperatorLoc,
2194                                             bool isArrow,
2195                                             CXXScopeSpec &SS,
2196                                             TypeSourceInfo *ScopeType,
2197                                             SourceLocation CCLoc,
2198                                             SourceLocation TildeLoc,
2199                                         PseudoDestructorTypeStorage Destroyed);
2200
2201   /// Build a new unary operator expression.
2202   ///
2203   /// By default, performs semantic analysis to build the new expression.
2204   /// Subclasses may override this routine to provide different behavior.
2205   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2206                                         UnaryOperatorKind Opc,
2207                                         Expr *SubExpr) {
2208     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2209   }
2210
2211   /// Build a new builtin offsetof expression.
2212   ///
2213   /// By default, performs semantic analysis to build the new expression.
2214   /// Subclasses may override this routine to provide different behavior.
2215   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2216                                  TypeSourceInfo *Type,
2217                                  ArrayRef<Sema::OffsetOfComponent> Components,
2218                                  SourceLocation RParenLoc) {
2219     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2220                                           RParenLoc);
2221   }
2222
2223   /// Build a new sizeof, alignof or vec_step expression with a
2224   /// type argument.
2225   ///
2226   /// By default, performs semantic analysis to build the new expression.
2227   /// Subclasses may override this routine to provide different behavior.
2228   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2229                                          SourceLocation OpLoc,
2230                                          UnaryExprOrTypeTrait ExprKind,
2231                                          SourceRange R) {
2232     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2233   }
2234
2235   /// Build a new sizeof, alignof or vec step expression with an
2236   /// expression argument.
2237   ///
2238   /// By default, performs semantic analysis to build the new expression.
2239   /// Subclasses may override this routine to provide different behavior.
2240   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2241                                          UnaryExprOrTypeTrait ExprKind,
2242                                          SourceRange R) {
2243     ExprResult Result
2244       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2245     if (Result.isInvalid())
2246       return ExprError();
2247
2248     return Result;
2249   }
2250
2251   /// Build a new array subscript expression.
2252   ///
2253   /// By default, performs semantic analysis to build the new expression.
2254   /// Subclasses may override this routine to provide different behavior.
2255   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2256                                              SourceLocation LBracketLoc,
2257                                              Expr *RHS,
2258                                              SourceLocation RBracketLoc) {
2259     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2260                                              LBracketLoc, RHS,
2261                                              RBracketLoc);
2262   }
2263
2264   /// Build a new array section expression.
2265   ///
2266   /// By default, performs semantic analysis to build the new expression.
2267   /// Subclasses may override this routine to provide different behavior.
2268   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2269                                         Expr *LowerBound,
2270                                         SourceLocation ColonLoc, Expr *Length,
2271                                         SourceLocation RBracketLoc) {
2272     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2273                                               ColonLoc, Length, RBracketLoc);
2274   }
2275
2276   /// Build a new call expression.
2277   ///
2278   /// By default, performs semantic analysis to build the new expression.
2279   /// Subclasses may override this routine to provide different behavior.
2280   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2281                                    MultiExprArg Args,
2282                                    SourceLocation RParenLoc,
2283                                    Expr *ExecConfig = nullptr) {
2284     return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args,
2285                                    RParenLoc, ExecConfig);
2286   }
2287
2288   /// Build a new member access expression.
2289   ///
2290   /// By default, performs semantic analysis to build the new expression.
2291   /// Subclasses may override this routine to provide different behavior.
2292   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2293                                bool isArrow,
2294                                NestedNameSpecifierLoc QualifierLoc,
2295                                SourceLocation TemplateKWLoc,
2296                                const DeclarationNameInfo &MemberNameInfo,
2297                                ValueDecl *Member,
2298                                NamedDecl *FoundDecl,
2299                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2300                                NamedDecl *FirstQualifierInScope) {
2301     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2302                                                                       isArrow);
2303     if (!Member->getDeclName()) {
2304       // We have a reference to an unnamed field.  This is always the
2305       // base of an anonymous struct/union member access, i.e. the
2306       // field is always of record type.
2307       assert(Member->getType()->isRecordType() &&
2308              "unnamed member not of record type?");
2309
2310       BaseResult =
2311         getSema().PerformObjectMemberConversion(BaseResult.get(),
2312                                                 QualifierLoc.getNestedNameSpecifier(),
2313                                                 FoundDecl, Member);
2314       if (BaseResult.isInvalid())
2315         return ExprError();
2316       Base = BaseResult.get();
2317
2318       CXXScopeSpec EmptySS;
2319       return getSema().BuildFieldReferenceExpr(
2320           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2321           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2322     }
2323
2324     CXXScopeSpec SS;
2325     SS.Adopt(QualifierLoc);
2326
2327     Base = BaseResult.get();
2328     QualType BaseType = Base->getType();
2329
2330     if (isArrow && !BaseType->isPointerType())
2331       return ExprError();
2332
2333     // FIXME: this involves duplicating earlier analysis in a lot of
2334     // cases; we should avoid this when possible.
2335     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2336     R.addDecl(FoundDecl);
2337     R.resolveKind();
2338
2339     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2340                                               SS, TemplateKWLoc,
2341                                               FirstQualifierInScope,
2342                                               R, ExplicitTemplateArgs,
2343                                               /*S*/nullptr);
2344   }
2345
2346   /// Build a new binary operator expression.
2347   ///
2348   /// By default, performs semantic analysis to build the new expression.
2349   /// Subclasses may override this routine to provide different behavior.
2350   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2351                                          BinaryOperatorKind Opc,
2352                                          Expr *LHS, Expr *RHS) {
2353     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2354   }
2355
2356   /// Build a new conditional operator expression.
2357   ///
2358   /// By default, performs semantic analysis to build the new expression.
2359   /// Subclasses may override this routine to provide different behavior.
2360   ExprResult RebuildConditionalOperator(Expr *Cond,
2361                                         SourceLocation QuestionLoc,
2362                                         Expr *LHS,
2363                                         SourceLocation ColonLoc,
2364                                         Expr *RHS) {
2365     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2366                                         LHS, RHS);
2367   }
2368
2369   /// Build a new C-style cast expression.
2370   ///
2371   /// By default, performs semantic analysis to build the new expression.
2372   /// Subclasses may override this routine to provide different behavior.
2373   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2374                                          TypeSourceInfo *TInfo,
2375                                          SourceLocation RParenLoc,
2376                                          Expr *SubExpr) {
2377     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2378                                          SubExpr);
2379   }
2380
2381   /// Build a new compound literal expression.
2382   ///
2383   /// By default, performs semantic analysis to build the new expression.
2384   /// Subclasses may override this routine to provide different behavior.
2385   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2386                                               TypeSourceInfo *TInfo,
2387                                               SourceLocation RParenLoc,
2388                                               Expr *Init) {
2389     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2390                                               Init);
2391   }
2392
2393   /// Build a new extended vector element access expression.
2394   ///
2395   /// By default, performs semantic analysis to build the new expression.
2396   /// Subclasses may override this routine to provide different behavior.
2397   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2398                                                SourceLocation OpLoc,
2399                                                SourceLocation AccessorLoc,
2400                                                IdentifierInfo &Accessor) {
2401
2402     CXXScopeSpec SS;
2403     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2404     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2405                                               OpLoc, /*IsArrow*/ false,
2406                                               SS, SourceLocation(),
2407                                               /*FirstQualifierInScope*/ nullptr,
2408                                               NameInfo,
2409                                               /* TemplateArgs */ nullptr,
2410                                               /*S*/ nullptr);
2411   }
2412
2413   /// Build a new initializer list expression.
2414   ///
2415   /// By default, performs semantic analysis to build the new expression.
2416   /// Subclasses may override this routine to provide different behavior.
2417   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2418                              MultiExprArg Inits,
2419                              SourceLocation RBraceLoc) {
2420     return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2421   }
2422
2423   /// Build a new designated initializer expression.
2424   ///
2425   /// By default, performs semantic analysis to build the new expression.
2426   /// Subclasses may override this routine to provide different behavior.
2427   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2428                                              MultiExprArg ArrayExprs,
2429                                              SourceLocation EqualOrColonLoc,
2430                                              bool GNUSyntax,
2431                                              Expr *Init) {
2432     ExprResult Result
2433       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2434                                            Init);
2435     if (Result.isInvalid())
2436       return ExprError();
2437
2438     return Result;
2439   }
2440
2441   /// Build a new value-initialized expression.
2442   ///
2443   /// By default, builds the implicit value initialization without performing
2444   /// any semantic analysis. Subclasses may override this routine to provide
2445   /// different behavior.
2446   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2447     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2448   }
2449
2450   /// Build a new \c va_arg expression.
2451   ///
2452   /// By default, performs semantic analysis to build the new expression.
2453   /// Subclasses may override this routine to provide different behavior.
2454   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2455                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2456                                     SourceLocation RParenLoc) {
2457     return getSema().BuildVAArgExpr(BuiltinLoc,
2458                                     SubExpr, TInfo,
2459                                     RParenLoc);
2460   }
2461
2462   /// Build a new expression list in parentheses.
2463   ///
2464   /// By default, performs semantic analysis to build the new expression.
2465   /// Subclasses may override this routine to provide different behavior.
2466   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2467                                   MultiExprArg SubExprs,
2468                                   SourceLocation RParenLoc) {
2469     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2470   }
2471
2472   /// Build a new address-of-label expression.
2473   ///
2474   /// By default, performs semantic analysis, using the name of the label
2475   /// rather than attempting to map the label statement itself.
2476   /// Subclasses may override this routine to provide different behavior.
2477   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2478                                   SourceLocation LabelLoc, LabelDecl *Label) {
2479     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2480   }
2481
2482   /// Build a new GNU statement expression.
2483   ///
2484   /// By default, performs semantic analysis to build the new expression.
2485   /// Subclasses may override this routine to provide different behavior.
2486   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2487                                    Stmt *SubStmt,
2488                                    SourceLocation RParenLoc) {
2489     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2490   }
2491
2492   /// Build a new __builtin_choose_expr expression.
2493   ///
2494   /// By default, performs semantic analysis to build the new expression.
2495   /// Subclasses may override this routine to provide different behavior.
2496   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2497                                      Expr *Cond, Expr *LHS, Expr *RHS,
2498                                      SourceLocation RParenLoc) {
2499     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2500                                    Cond, LHS, RHS,
2501                                    RParenLoc);
2502   }
2503
2504   /// Build a new generic selection expression.
2505   ///
2506   /// By default, performs semantic analysis to build the new expression.
2507   /// Subclasses may override this routine to provide different behavior.
2508   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2509                                          SourceLocation DefaultLoc,
2510                                          SourceLocation RParenLoc,
2511                                          Expr *ControllingExpr,
2512                                          ArrayRef<TypeSourceInfo *> Types,
2513                                          ArrayRef<Expr *> Exprs) {
2514     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2515                                                 ControllingExpr, Types, Exprs);
2516   }
2517
2518   /// Build a new overloaded operator call expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// The semantic analysis provides the behavior of template instantiation,
2522   /// copying with transformations that turn what looks like an overloaded
2523   /// operator call into a use of a builtin operator, performing
2524   /// argument-dependent lookup, etc. Subclasses may override this routine to
2525   /// provide different behavior.
2526   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2527                                               SourceLocation OpLoc,
2528                                               Expr *Callee,
2529                                               Expr *First,
2530                                               Expr *Second);
2531
2532   /// Build a new C++ "named" cast expression, such as static_cast or
2533   /// reinterpret_cast.
2534   ///
2535   /// By default, this routine dispatches to one of the more-specific routines
2536   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2537   /// Subclasses may override this routine to provide different behavior.
2538   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2539                                            Stmt::StmtClass Class,
2540                                            SourceLocation LAngleLoc,
2541                                            TypeSourceInfo *TInfo,
2542                                            SourceLocation RAngleLoc,
2543                                            SourceLocation LParenLoc,
2544                                            Expr *SubExpr,
2545                                            SourceLocation RParenLoc) {
2546     switch (Class) {
2547     case Stmt::CXXStaticCastExprClass:
2548       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2549                                                    RAngleLoc, LParenLoc,
2550                                                    SubExpr, RParenLoc);
2551
2552     case Stmt::CXXDynamicCastExprClass:
2553       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2554                                                     RAngleLoc, LParenLoc,
2555                                                     SubExpr, RParenLoc);
2556
2557     case Stmt::CXXReinterpretCastExprClass:
2558       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2559                                                         RAngleLoc, LParenLoc,
2560                                                         SubExpr,
2561                                                         RParenLoc);
2562
2563     case Stmt::CXXConstCastExprClass:
2564       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2565                                                    RAngleLoc, LParenLoc,
2566                                                    SubExpr, RParenLoc);
2567
2568     default:
2569       llvm_unreachable("Invalid C++ named cast");
2570     }
2571   }
2572
2573   /// Build a new C++ static_cast expression.
2574   ///
2575   /// By default, performs semantic analysis to build the new expression.
2576   /// Subclasses may override this routine to provide different behavior.
2577   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2578                                             SourceLocation LAngleLoc,
2579                                             TypeSourceInfo *TInfo,
2580                                             SourceLocation RAngleLoc,
2581                                             SourceLocation LParenLoc,
2582                                             Expr *SubExpr,
2583                                             SourceLocation RParenLoc) {
2584     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2585                                        TInfo, SubExpr,
2586                                        SourceRange(LAngleLoc, RAngleLoc),
2587                                        SourceRange(LParenLoc, RParenLoc));
2588   }
2589
2590   /// Build a new C++ dynamic_cast expression.
2591   ///
2592   /// By default, performs semantic analysis to build the new expression.
2593   /// Subclasses may override this routine to provide different behavior.
2594   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2595                                              SourceLocation LAngleLoc,
2596                                              TypeSourceInfo *TInfo,
2597                                              SourceLocation RAngleLoc,
2598                                              SourceLocation LParenLoc,
2599                                              Expr *SubExpr,
2600                                              SourceLocation RParenLoc) {
2601     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2602                                        TInfo, SubExpr,
2603                                        SourceRange(LAngleLoc, RAngleLoc),
2604                                        SourceRange(LParenLoc, RParenLoc));
2605   }
2606
2607   /// Build a new C++ reinterpret_cast expression.
2608   ///
2609   /// By default, performs semantic analysis to build the new expression.
2610   /// Subclasses may override this routine to provide different behavior.
2611   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2612                                                  SourceLocation LAngleLoc,
2613                                                  TypeSourceInfo *TInfo,
2614                                                  SourceLocation RAngleLoc,
2615                                                  SourceLocation LParenLoc,
2616                                                  Expr *SubExpr,
2617                                                  SourceLocation RParenLoc) {
2618     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2619                                        TInfo, SubExpr,
2620                                        SourceRange(LAngleLoc, RAngleLoc),
2621                                        SourceRange(LParenLoc, RParenLoc));
2622   }
2623
2624   /// Build a new C++ const_cast expression.
2625   ///
2626   /// By default, performs semantic analysis to build the new expression.
2627   /// Subclasses may override this routine to provide different behavior.
2628   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2629                                            SourceLocation LAngleLoc,
2630                                            TypeSourceInfo *TInfo,
2631                                            SourceLocation RAngleLoc,
2632                                            SourceLocation LParenLoc,
2633                                            Expr *SubExpr,
2634                                            SourceLocation RParenLoc) {
2635     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2636                                        TInfo, SubExpr,
2637                                        SourceRange(LAngleLoc, RAngleLoc),
2638                                        SourceRange(LParenLoc, RParenLoc));
2639   }
2640
2641   /// Build a new C++ functional-style cast expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
2645   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2646                                           SourceLocation LParenLoc,
2647                                           Expr *Sub,
2648                                           SourceLocation RParenLoc,
2649                                           bool ListInitialization) {
2650     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2651                                                MultiExprArg(&Sub, 1), RParenLoc,
2652                                                ListInitialization);
2653   }
2654
2655   /// Build a new C++ __builtin_bit_cast expression.
2656   ///
2657   /// By default, performs semantic analysis to build the new expression.
2658   /// Subclasses may override this routine to provide different behavior.
2659   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2660                                        TypeSourceInfo *TSI, Expr *Sub,
2661                                        SourceLocation RParenLoc) {
2662     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2663   }
2664
2665   /// Build a new C++ typeid(type) expression.
2666   ///
2667   /// By default, performs semantic analysis to build the new expression.
2668   /// Subclasses may override this routine to provide different behavior.
2669   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2670                                         SourceLocation TypeidLoc,
2671                                         TypeSourceInfo *Operand,
2672                                         SourceLocation RParenLoc) {
2673     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2674                                     RParenLoc);
2675   }
2676
2677
2678   /// Build a new C++ typeid(expr) expression.
2679   ///
2680   /// By default, performs semantic analysis to build the new expression.
2681   /// Subclasses may override this routine to provide different behavior.
2682   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2683                                         SourceLocation TypeidLoc,
2684                                         Expr *Operand,
2685                                         SourceLocation RParenLoc) {
2686     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2687                                     RParenLoc);
2688   }
2689
2690   /// Build a new C++ __uuidof(type) expression.
2691   ///
2692   /// By default, performs semantic analysis to build the new expression.
2693   /// Subclasses may override this routine to provide different behavior.
2694   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2695                                         SourceLocation TypeidLoc,
2696                                         TypeSourceInfo *Operand,
2697                                         SourceLocation RParenLoc) {
2698     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2699                                     RParenLoc);
2700   }
2701
2702   /// Build a new C++ __uuidof(expr) expression.
2703   ///
2704   /// By default, performs semantic analysis to build the new expression.
2705   /// Subclasses may override this routine to provide different behavior.
2706   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2707                                         SourceLocation TypeidLoc,
2708                                         Expr *Operand,
2709                                         SourceLocation RParenLoc) {
2710     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2711                                     RParenLoc);
2712   }
2713
2714   /// Build a new C++ "this" expression.
2715   ///
2716   /// By default, builds a new "this" expression without performing any
2717   /// semantic analysis. Subclasses may override this routine to provide
2718   /// different behavior.
2719   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2720                                 QualType ThisType,
2721                                 bool isImplicit) {
2722     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2723   }
2724
2725   /// Build a new C++ throw expression.
2726   ///
2727   /// By default, performs semantic analysis to build the new expression.
2728   /// Subclasses may override this routine to provide different behavior.
2729   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2730                                  bool IsThrownVariableInScope) {
2731     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2732   }
2733
2734   /// Build a new C++ default-argument expression.
2735   ///
2736   /// By default, builds a new default-argument expression, which does not
2737   /// require any semantic analysis. Subclasses may override this routine to
2738   /// provide different behavior.
2739   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2740     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2741                                      getSema().CurContext);
2742   }
2743
2744   /// Build a new C++11 default-initialization expression.
2745   ///
2746   /// By default, builds a new default field initialization expression, which
2747   /// does not require any semantic analysis. Subclasses may override this
2748   /// routine to provide different behavior.
2749   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2750                                        FieldDecl *Field) {
2751     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2752                                       getSema().CurContext);
2753   }
2754
2755   /// Build a new C++ zero-initialization expression.
2756   ///
2757   /// By default, performs semantic analysis to build the new expression.
2758   /// Subclasses may override this routine to provide different behavior.
2759   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2760                                            SourceLocation LParenLoc,
2761                                            SourceLocation RParenLoc) {
2762     return getSema().BuildCXXTypeConstructExpr(
2763         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2764   }
2765
2766   /// Build a new C++ "new" expression.
2767   ///
2768   /// By default, performs semantic analysis to build the new expression.
2769   /// Subclasses may override this routine to provide different behavior.
2770   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2771                                bool UseGlobal,
2772                                SourceLocation PlacementLParen,
2773                                MultiExprArg PlacementArgs,
2774                                SourceLocation PlacementRParen,
2775                                SourceRange TypeIdParens,
2776                                QualType AllocatedType,
2777                                TypeSourceInfo *AllocatedTypeInfo,
2778                                Optional<Expr *> ArraySize,
2779                                SourceRange DirectInitRange,
2780                                Expr *Initializer) {
2781     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2782                                  PlacementLParen,
2783                                  PlacementArgs,
2784                                  PlacementRParen,
2785                                  TypeIdParens,
2786                                  AllocatedType,
2787                                  AllocatedTypeInfo,
2788                                  ArraySize,
2789                                  DirectInitRange,
2790                                  Initializer);
2791   }
2792
2793   /// Build a new C++ "delete" expression.
2794   ///
2795   /// By default, performs semantic analysis to build the new expression.
2796   /// Subclasses may override this routine to provide different behavior.
2797   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2798                                         bool IsGlobalDelete,
2799                                         bool IsArrayForm,
2800                                         Expr *Operand) {
2801     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2802                                     Operand);
2803   }
2804
2805   /// Build a new type trait expression.
2806   ///
2807   /// By default, performs semantic analysis to build the new expression.
2808   /// Subclasses may override this routine to provide different behavior.
2809   ExprResult RebuildTypeTrait(TypeTrait Trait,
2810                               SourceLocation StartLoc,
2811                               ArrayRef<TypeSourceInfo *> Args,
2812                               SourceLocation RParenLoc) {
2813     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2814   }
2815
2816   /// Build a new array type trait expression.
2817   ///
2818   /// By default, performs semantic analysis to build the new expression.
2819   /// Subclasses may override this routine to provide different behavior.
2820   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2821                                    SourceLocation StartLoc,
2822                                    TypeSourceInfo *TSInfo,
2823                                    Expr *DimExpr,
2824                                    SourceLocation RParenLoc) {
2825     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2826   }
2827
2828   /// Build a new expression trait expression.
2829   ///
2830   /// By default, performs semantic analysis to build the new expression.
2831   /// Subclasses may override this routine to provide different behavior.
2832   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2833                                    SourceLocation StartLoc,
2834                                    Expr *Queried,
2835                                    SourceLocation RParenLoc) {
2836     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2837   }
2838
2839   /// Build a new (previously unresolved) declaration reference
2840   /// expression.
2841   ///
2842   /// By default, performs semantic analysis to build the new expression.
2843   /// Subclasses may override this routine to provide different behavior.
2844   ExprResult RebuildDependentScopeDeclRefExpr(
2845                                           NestedNameSpecifierLoc QualifierLoc,
2846                                           SourceLocation TemplateKWLoc,
2847                                        const DeclarationNameInfo &NameInfo,
2848                               const TemplateArgumentListInfo *TemplateArgs,
2849                                           bool IsAddressOfOperand,
2850                                           TypeSourceInfo **RecoveryTSI) {
2851     CXXScopeSpec SS;
2852     SS.Adopt(QualifierLoc);
2853
2854     if (TemplateArgs || TemplateKWLoc.isValid())
2855       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2856                                                     TemplateArgs);
2857
2858     return getSema().BuildQualifiedDeclarationNameExpr(
2859         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2860   }
2861
2862   /// Build a new template-id expression.
2863   ///
2864   /// By default, performs semantic analysis to build the new expression.
2865   /// Subclasses may override this routine to provide different behavior.
2866   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2867                                    SourceLocation TemplateKWLoc,
2868                                    LookupResult &R,
2869                                    bool RequiresADL,
2870                               const TemplateArgumentListInfo *TemplateArgs) {
2871     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2872                                          TemplateArgs);
2873   }
2874
2875   /// Build a new object-construction expression.
2876   ///
2877   /// By default, performs semantic analysis to build the new expression.
2878   /// Subclasses may override this routine to provide different behavior.
2879   ExprResult RebuildCXXConstructExpr(QualType T,
2880                                      SourceLocation Loc,
2881                                      CXXConstructorDecl *Constructor,
2882                                      bool IsElidable,
2883                                      MultiExprArg Args,
2884                                      bool HadMultipleCandidates,
2885                                      bool ListInitialization,
2886                                      bool StdInitListInitialization,
2887                                      bool RequiresZeroInit,
2888                              CXXConstructExpr::ConstructionKind ConstructKind,
2889                                      SourceRange ParenRange) {
2890     SmallVector<Expr*, 8> ConvertedArgs;
2891     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2892                                           ConvertedArgs))
2893       return ExprError();
2894
2895     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2896                                            IsElidable,
2897                                            ConvertedArgs,
2898                                            HadMultipleCandidates,
2899                                            ListInitialization,
2900                                            StdInitListInitialization,
2901                                            RequiresZeroInit, ConstructKind,
2902                                            ParenRange);
2903   }
2904
2905   /// Build a new implicit construction via inherited constructor
2906   /// expression.
2907   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2908                                              CXXConstructorDecl *Constructor,
2909                                              bool ConstructsVBase,
2910                                              bool InheritedFromVBase) {
2911     return new (getSema().Context) CXXInheritedCtorInitExpr(
2912         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2913   }
2914
2915   /// Build a new object-construction expression.
2916   ///
2917   /// By default, performs semantic analysis to build the new expression.
2918   /// Subclasses may override this routine to provide different behavior.
2919   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2920                                            SourceLocation LParenOrBraceLoc,
2921                                            MultiExprArg Args,
2922                                            SourceLocation RParenOrBraceLoc,
2923                                            bool ListInitialization) {
2924     return getSema().BuildCXXTypeConstructExpr(
2925         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2926   }
2927
2928   /// Build a new object-construction expression.
2929   ///
2930   /// By default, performs semantic analysis to build the new expression.
2931   /// Subclasses may override this routine to provide different behavior.
2932   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2933                                                SourceLocation LParenLoc,
2934                                                MultiExprArg Args,
2935                                                SourceLocation RParenLoc,
2936                                                bool ListInitialization) {
2937     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2938                                                RParenLoc, ListInitialization);
2939   }
2940
2941   /// Build a new member reference expression.
2942   ///
2943   /// By default, performs semantic analysis to build the new expression.
2944   /// Subclasses may override this routine to provide different behavior.
2945   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2946                                                 QualType BaseType,
2947                                                 bool IsArrow,
2948                                                 SourceLocation OperatorLoc,
2949                                           NestedNameSpecifierLoc QualifierLoc,
2950                                                 SourceLocation TemplateKWLoc,
2951                                             NamedDecl *FirstQualifierInScope,
2952                                    const DeclarationNameInfo &MemberNameInfo,
2953                               const TemplateArgumentListInfo *TemplateArgs) {
2954     CXXScopeSpec SS;
2955     SS.Adopt(QualifierLoc);
2956
2957     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2958                                             OperatorLoc, IsArrow,
2959                                             SS, TemplateKWLoc,
2960                                             FirstQualifierInScope,
2961                                             MemberNameInfo,
2962                                             TemplateArgs, /*S*/nullptr);
2963   }
2964
2965   /// Build a new member reference expression.
2966   ///
2967   /// By default, performs semantic analysis to build the new expression.
2968   /// Subclasses may override this routine to provide different behavior.
2969   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2970                                          SourceLocation OperatorLoc,
2971                                          bool IsArrow,
2972                                          NestedNameSpecifierLoc QualifierLoc,
2973                                          SourceLocation TemplateKWLoc,
2974                                          NamedDecl *FirstQualifierInScope,
2975                                          LookupResult &R,
2976                                 const TemplateArgumentListInfo *TemplateArgs) {
2977     CXXScopeSpec SS;
2978     SS.Adopt(QualifierLoc);
2979
2980     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2981                                             OperatorLoc, IsArrow,
2982                                             SS, TemplateKWLoc,
2983                                             FirstQualifierInScope,
2984                                             R, TemplateArgs, /*S*/nullptr);
2985   }
2986
2987   /// Build a new noexcept expression.
2988   ///
2989   /// By default, performs semantic analysis to build the new expression.
2990   /// Subclasses may override this routine to provide different behavior.
2991   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2992     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2993   }
2994
2995   /// Build a new expression to compute the length of a parameter pack.
2996   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2997                                    NamedDecl *Pack,
2998                                    SourceLocation PackLoc,
2999                                    SourceLocation RParenLoc,
3000                                    Optional<unsigned> Length,
3001                                    ArrayRef<TemplateArgument> PartialArgs) {
3002     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3003                                   RParenLoc, Length, PartialArgs);
3004   }
3005
3006   /// Build a new expression representing a call to a source location
3007   ///  builtin.
3008   ///
3009   /// By default, performs semantic analysis to build the new expression.
3010   /// Subclasses may override this routine to provide different behavior.
3011   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3012                                   SourceLocation BuiltinLoc,
3013                                   SourceLocation RPLoc,
3014                                   DeclContext *ParentContext) {
3015     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3016   }
3017
3018   /// Build a new Objective-C boxed expression.
3019   ///
3020   /// By default, performs semantic analysis to build the new expression.
3021   /// Subclasses may override this routine to provide different behavior.
3022   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3023     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3024   }
3025
3026   /// Build a new Objective-C array literal.
3027   ///
3028   /// By default, performs semantic analysis to build the new expression.
3029   /// Subclasses may override this routine to provide different behavior.
3030   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3031                                      Expr **Elements, unsigned NumElements) {
3032     return getSema().BuildObjCArrayLiteral(Range,
3033                                            MultiExprArg(Elements, NumElements));
3034   }
3035
3036   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3037                                          Expr *Base, Expr *Key,
3038                                          ObjCMethodDecl *getterMethod,
3039                                          ObjCMethodDecl *setterMethod) {
3040     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3041                                                    getterMethod, setterMethod);
3042   }
3043
3044   /// Build a new Objective-C dictionary literal.
3045   ///
3046   /// By default, performs semantic analysis to build the new expression.
3047   /// Subclasses may override this routine to provide different behavior.
3048   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3049                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3050     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3051   }
3052
3053   /// Build a new Objective-C \@encode expression.
3054   ///
3055   /// By default, performs semantic analysis to build the new expression.
3056   /// Subclasses may override this routine to provide different behavior.
3057   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3058                                          TypeSourceInfo *EncodeTypeInfo,
3059                                          SourceLocation RParenLoc) {
3060     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3061   }
3062
3063   /// Build a new Objective-C class message.
3064   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3065                                           Selector Sel,
3066                                           ArrayRef<SourceLocation> SelectorLocs,
3067                                           ObjCMethodDecl *Method,
3068                                           SourceLocation LBracLoc,
3069                                           MultiExprArg Args,
3070                                           SourceLocation RBracLoc) {
3071     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3072                                      ReceiverTypeInfo->getType(),
3073                                      /*SuperLoc=*/SourceLocation(),
3074                                      Sel, Method, LBracLoc, SelectorLocs,
3075                                      RBracLoc, Args);
3076   }
3077
3078   /// Build a new Objective-C instance message.
3079   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3080                                           Selector Sel,
3081                                           ArrayRef<SourceLocation> SelectorLocs,
3082                                           ObjCMethodDecl *Method,
3083                                           SourceLocation LBracLoc,
3084                                           MultiExprArg Args,
3085                                           SourceLocation RBracLoc) {
3086     return SemaRef.BuildInstanceMessage(Receiver,
3087                                         Receiver->getType(),
3088                                         /*SuperLoc=*/SourceLocation(),
3089                                         Sel, Method, LBracLoc, SelectorLocs,
3090                                         RBracLoc, Args);
3091   }
3092
3093   /// Build a new Objective-C instance/class message to 'super'.
3094   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3095                                     Selector Sel,
3096                                     ArrayRef<SourceLocation> SelectorLocs,
3097                                     QualType SuperType,
3098                                     ObjCMethodDecl *Method,
3099                                     SourceLocation LBracLoc,
3100                                     MultiExprArg Args,
3101                                     SourceLocation RBracLoc) {
3102     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3103                                           SuperType,
3104                                           SuperLoc,
3105                                           Sel, Method, LBracLoc, SelectorLocs,
3106                                           RBracLoc, Args)
3107                                       : SemaRef.BuildClassMessage(nullptr,
3108                                           SuperType,
3109                                           SuperLoc,
3110                                           Sel, Method, LBracLoc, SelectorLocs,
3111                                           RBracLoc, Args);
3112
3113
3114   }
3115
3116   /// Build a new Objective-C ivar reference expression.
3117   ///
3118   /// By default, performs semantic analysis to build the new expression.
3119   /// Subclasses may override this routine to provide different behavior.
3120   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3121                                           SourceLocation IvarLoc,
3122                                           bool IsArrow, bool IsFreeIvar) {
3123     CXXScopeSpec SS;
3124     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3125     ExprResult Result = getSema().BuildMemberReferenceExpr(
3126         BaseArg, BaseArg->getType(),
3127         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3128         /*FirstQualifierInScope=*/nullptr, NameInfo,
3129         /*TemplateArgs=*/nullptr,
3130         /*S=*/nullptr);
3131     if (IsFreeIvar && Result.isUsable())
3132       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3133     return Result;
3134   }
3135
3136   /// Build a new Objective-C property reference expression.
3137   ///
3138   /// By default, performs semantic analysis to build the new expression.
3139   /// Subclasses may override this routine to provide different behavior.
3140   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3141                                         ObjCPropertyDecl *Property,
3142                                         SourceLocation PropertyLoc) {
3143     CXXScopeSpec SS;
3144     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3145     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3146                                               /*FIXME:*/PropertyLoc,
3147                                               /*IsArrow=*/false,
3148                                               SS, SourceLocation(),
3149                                               /*FirstQualifierInScope=*/nullptr,
3150                                               NameInfo,
3151                                               /*TemplateArgs=*/nullptr,
3152                                               /*S=*/nullptr);
3153   }
3154
3155   /// Build a new Objective-C property reference expression.
3156   ///
3157   /// By default, performs semantic analysis to build the new expression.
3158   /// Subclasses may override this routine to provide different behavior.
3159   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3160                                         ObjCMethodDecl *Getter,
3161                                         ObjCMethodDecl *Setter,
3162                                         SourceLocation PropertyLoc) {
3163     // Since these expressions can only be value-dependent, we do not
3164     // need to perform semantic analysis again.
3165     return Owned(
3166       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3167                                                   VK_LValue, OK_ObjCProperty,
3168                                                   PropertyLoc, Base));
3169   }
3170
3171   /// Build a new Objective-C "isa" expression.
3172   ///
3173   /// By default, performs semantic analysis to build the new expression.
3174   /// Subclasses may override this routine to provide different behavior.
3175   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3176                                 SourceLocation OpLoc, bool IsArrow) {
3177     CXXScopeSpec SS;
3178     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3179     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3180                                               OpLoc, IsArrow,
3181                                               SS, SourceLocation(),
3182                                               /*FirstQualifierInScope=*/nullptr,
3183                                               NameInfo,
3184                                               /*TemplateArgs=*/nullptr,
3185                                               /*S=*/nullptr);
3186   }
3187
3188   /// Build a new shuffle vector expression.
3189   ///
3190   /// By default, performs semantic analysis to build the new expression.
3191   /// Subclasses may override this routine to provide different behavior.
3192   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3193                                       MultiExprArg SubExprs,
3194                                       SourceLocation RParenLoc) {
3195     // Find the declaration for __builtin_shufflevector
3196     const IdentifierInfo &Name
3197       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3198     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3199     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3200     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3201
3202     // Build a reference to the __builtin_shufflevector builtin
3203     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3204     Expr *Callee = new (SemaRef.Context)
3205         DeclRefExpr(SemaRef.Context, Builtin, false,
3206                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3207     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3208     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3209                                        CK_BuiltinFnToFnPtr).get();
3210
3211     // Build the CallExpr
3212     ExprResult TheCall = CallExpr::Create(
3213         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3214         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3215
3216     // Type-check the __builtin_shufflevector expression.
3217     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3218   }
3219
3220   /// Build a new convert vector expression.
3221   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3222                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3223                                       SourceLocation RParenLoc) {
3224     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3225                                          BuiltinLoc, RParenLoc);
3226   }
3227
3228   /// Build a new template argument pack expansion.
3229   ///
3230   /// By default, performs semantic analysis to build a new pack expansion
3231   /// for a template argument. Subclasses may override this routine to provide
3232   /// different behavior.
3233   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3234                                            SourceLocation EllipsisLoc,
3235                                            Optional<unsigned> NumExpansions) {
3236     switch (Pattern.getArgument().getKind()) {
3237     case TemplateArgument::Expression: {
3238       ExprResult Result
3239         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3240                                        EllipsisLoc, NumExpansions);
3241       if (Result.isInvalid())
3242         return TemplateArgumentLoc();
3243
3244       return TemplateArgumentLoc(Result.get(), Result.get());
3245     }
3246
3247     case TemplateArgument::Template:
3248       return TemplateArgumentLoc(TemplateArgument(
3249                                           Pattern.getArgument().getAsTemplate(),
3250                                                   NumExpansions),
3251                                  Pattern.getTemplateQualifierLoc(),
3252                                  Pattern.getTemplateNameLoc(),
3253                                  EllipsisLoc);
3254
3255     case TemplateArgument::Null:
3256     case TemplateArgument::Integral:
3257     case TemplateArgument::Declaration:
3258     case TemplateArgument::Pack:
3259     case TemplateArgument::TemplateExpansion:
3260     case TemplateArgument::NullPtr:
3261       llvm_unreachable("Pack expansion pattern has no parameter packs");
3262
3263     case TemplateArgument::Type:
3264       if (TypeSourceInfo *Expansion
3265             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3266                                            EllipsisLoc,
3267                                            NumExpansions))
3268         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3269                                    Expansion);
3270       break;
3271     }
3272
3273     return TemplateArgumentLoc();
3274   }
3275
3276   /// Build a new expression pack expansion.
3277   ///
3278   /// By default, performs semantic analysis to build a new pack expansion
3279   /// for an expression. Subclasses may override this routine to provide
3280   /// different behavior.
3281   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3282                                   Optional<unsigned> NumExpansions) {
3283     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3284   }
3285
3286   /// Build a new C++1z fold-expression.
3287   ///
3288   /// By default, performs semantic analysis in order to build a new fold
3289   /// expression.
3290   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3291                                 BinaryOperatorKind Operator,
3292                                 SourceLocation EllipsisLoc, Expr *RHS,
3293                                 SourceLocation RParenLoc,
3294                                 Optional<unsigned> NumExpansions) {
3295     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3296                                       RHS, RParenLoc, NumExpansions);
3297   }
3298
3299   /// Build an empty C++1z fold-expression with the given operator.
3300   ///
3301   /// By default, produces the fallback value for the fold-expression, or
3302   /// produce an error if there is no fallback value.
3303   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3304                                      BinaryOperatorKind Operator) {
3305     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3306   }
3307
3308   /// Build a new atomic operation expression.
3309   ///
3310   /// By default, performs semantic analysis to build the new expression.
3311   /// Subclasses may override this routine to provide different behavior.
3312   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3313                                MultiExprArg SubExprs,
3314                                QualType RetTy,
3315                                AtomicExpr::AtomicOp Op,
3316                                SourceLocation RParenLoc) {
3317     // Just create the expression; there is not any interesting semantic
3318     // analysis here because we can't actually build an AtomicExpr until
3319     // we are sure it is semantically sound.
3320     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3321                                             RParenLoc);
3322   }
3323
3324 private:
3325   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3326                                      QualType ObjectType,
3327                                      NamedDecl *FirstQualifierInScope,
3328                                      CXXScopeSpec &SS);
3329
3330   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3331                                              QualType ObjectType,
3332                                              NamedDecl *FirstQualifierInScope,
3333                                              CXXScopeSpec &SS);
3334
3335   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3336                                             NamedDecl *FirstQualifierInScope,
3337                                             CXXScopeSpec &SS);
3338
3339   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3340                                       DependentNameTypeLoc TL,
3341                                       bool DeducibleTSTContext);
3342 };
3343
3344 template <typename Derived>
3345 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3346   if (!S)
3347     return S;
3348
3349   switch (S->getStmtClass()) {
3350   case Stmt::NoStmtClass: break;
3351
3352   // Transform individual statement nodes
3353   // Pass SDK into statements that can produce a value
3354 #define STMT(Node, Parent)                                              \
3355   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3356 #define VALUESTMT(Node, Parent)                                         \
3357   case Stmt::Node##Class:                                               \
3358     return getDerived().Transform##Node(cast<Node>(S), SDK);
3359 #define ABSTRACT_STMT(Node)
3360 #define EXPR(Node, Parent)
3361 #include "clang/AST/StmtNodes.inc"
3362
3363   // Transform expressions by calling TransformExpr.
3364 #define STMT(Node, Parent)
3365 #define ABSTRACT_STMT(Stmt)
3366 #define EXPR(Node, Parent) case Stmt::Node##Class:
3367 #include "clang/AST/StmtNodes.inc"
3368     {
3369       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3370
3371       if (SDK == SDK_StmtExprResult)
3372         E = getSema().ActOnStmtExprResult(E);
3373       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3374     }
3375   }
3376
3377   return S;
3378 }
3379
3380 template<typename Derived>
3381 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3382   if (!S)
3383     return S;
3384
3385   switch (S->getClauseKind()) {
3386   default: break;
3387   // Transform individual clause nodes
3388 #define OPENMP_CLAUSE(Name, Class)                                             \
3389   case OMPC_ ## Name :                                                         \
3390     return getDerived().Transform ## Class(cast<Class>(S));
3391 #include "clang/Basic/OpenMPKinds.def"
3392   }
3393
3394   return S;
3395 }
3396
3397
3398 template<typename Derived>
3399 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3400   if (!E)
3401     return E;
3402
3403   switch (E->getStmtClass()) {
3404     case Stmt::NoStmtClass: break;
3405 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3406 #define ABSTRACT_STMT(Stmt)
3407 #define EXPR(Node, Parent)                                              \
3408     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3409 #include "clang/AST/StmtNodes.inc"
3410   }
3411
3412   return E;
3413 }
3414
3415 template<typename Derived>
3416 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3417                                                         bool NotCopyInit) {
3418   // Initializers are instantiated like expressions, except that various outer
3419   // layers are stripped.
3420   if (!Init)
3421     return Init;
3422
3423   if (auto *FE = dyn_cast<FullExpr>(Init))
3424     Init = FE->getSubExpr();
3425
3426   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3427     Init = AIL->getCommonExpr();
3428
3429   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3430     Init = MTE->GetTemporaryExpr();
3431
3432   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3433     Init = Binder->getSubExpr();
3434
3435   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3436     Init = ICE->getSubExprAsWritten();
3437
3438   if (CXXStdInitializerListExpr *ILE =
3439           dyn_cast<CXXStdInitializerListExpr>(Init))
3440     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3441
3442   // If this is copy-initialization, we only need to reconstruct
3443   // InitListExprs. Other forms of copy-initialization will be a no-op if
3444   // the initializer is already the right type.
3445   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3446   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3447     return getDerived().TransformExpr(Init);
3448
3449   // Revert value-initialization back to empty parens.
3450   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3451     SourceRange Parens = VIE->getSourceRange();
3452     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3453                                              Parens.getEnd());
3454   }
3455
3456   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3457   if (isa<ImplicitValueInitExpr>(Init))
3458     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3459                                              SourceLocation());
3460
3461   // Revert initialization by constructor back to a parenthesized or braced list
3462   // of expressions. Any other form of initializer can just be reused directly.
3463   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3464     return getDerived().TransformExpr(Init);
3465
3466   // If the initialization implicitly converted an initializer list to a
3467   // std::initializer_list object, unwrap the std::initializer_list too.
3468   if (Construct && Construct->isStdInitListInitialization())
3469     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3470
3471   // Enter a list-init context if this was list initialization.
3472   EnterExpressionEvaluationContext Context(
3473       getSema(), EnterExpressionEvaluationContext::InitList,
3474       Construct->isListInitialization());
3475
3476   SmallVector<Expr*, 8> NewArgs;
3477   bool ArgChanged = false;
3478   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3479                                   /*IsCall*/true, NewArgs, &ArgChanged))
3480     return ExprError();
3481
3482   // If this was list initialization, revert to syntactic list form.
3483   if (Construct->isListInitialization())
3484     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3485                                         Construct->getEndLoc());
3486
3487   // Build a ParenListExpr to represent anything else.
3488   SourceRange Parens = Construct->getParenOrBraceRange();
3489   if (Parens.isInvalid()) {
3490     // This was a variable declaration's initialization for which no initializer
3491     // was specified.
3492     assert(NewArgs.empty() &&
3493            "no parens or braces but have direct init with arguments?");
3494     return ExprEmpty();
3495   }
3496   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3497                                            Parens.getEnd());
3498 }
3499
3500 template<typename Derived>
3501 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3502                                             unsigned NumInputs,
3503                                             bool IsCall,
3504                                       SmallVectorImpl<Expr *> &Outputs,
3505                                             bool *ArgChanged) {
3506   for (unsigned I = 0; I != NumInputs; ++I) {
3507     // If requested, drop call arguments that need to be dropped.
3508     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3509       if (ArgChanged)
3510         *ArgChanged = true;
3511
3512       break;
3513     }
3514
3515     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3516       Expr *Pattern = Expansion->getPattern();
3517
3518       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3519       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3520       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3521
3522       // Determine whether the set of unexpanded parameter packs can and should
3523       // be expanded.
3524       bool Expand = true;
3525       bool RetainExpansion = false;
3526       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3527       Optional<unsigned> NumExpansions = OrigNumExpansions;
3528       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3529                                                Pattern->getSourceRange(),
3530                                                Unexpanded,
3531                                                Expand, RetainExpansion,
3532                                                NumExpansions))
3533         return true;
3534
3535       if (!Expand) {
3536         // The transform has determined that we should perform a simple
3537         // transformation on the pack expansion, producing another pack
3538         // expansion.
3539         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3540         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3541         if (OutPattern.isInvalid())
3542           return true;
3543
3544         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3545                                                 Expansion->getEllipsisLoc(),
3546                                                            NumExpansions);
3547         if (Out.isInvalid())
3548           return true;
3549
3550         if (ArgChanged)
3551           *ArgChanged = true;
3552         Outputs.push_back(Out.get());
3553         continue;
3554       }
3555
3556       // Record right away that the argument was changed.  This needs
3557       // to happen even if the array expands to nothing.
3558       if (ArgChanged) *ArgChanged = true;
3559
3560       // The transform has determined that we should perform an elementwise
3561       // expansion of the pattern. Do so.
3562       for (unsigned I = 0; I != *NumExpansions; ++I) {
3563         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3564         ExprResult Out = getDerived().TransformExpr(Pattern);
3565         if (Out.isInvalid())
3566           return true;
3567
3568         if (Out.get()->containsUnexpandedParameterPack()) {
3569           Out = getDerived().RebuildPackExpansion(
3570               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3571           if (Out.isInvalid())
3572             return true;
3573         }
3574
3575         Outputs.push_back(Out.get());
3576       }
3577
3578       // If we're supposed to retain a pack expansion, do so by temporarily
3579       // forgetting the partially-substituted parameter pack.
3580       if (RetainExpansion) {
3581         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3582
3583         ExprResult Out = getDerived().TransformExpr(Pattern);
3584         if (Out.isInvalid())
3585           return true;
3586
3587         Out = getDerived().RebuildPackExpansion(
3588             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3589         if (Out.isInvalid())
3590           return true;
3591
3592         Outputs.push_back(Out.get());
3593       }
3594
3595       continue;
3596     }
3597
3598     ExprResult Result =
3599       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3600              : getDerived().TransformExpr(Inputs[I]);
3601     if (Result.isInvalid())
3602       return true;
3603
3604     if (Result.get() != Inputs[I] && ArgChanged)
3605       *ArgChanged = true;
3606
3607     Outputs.push_back(Result.get());
3608   }
3609
3610   return false;
3611 }
3612
3613 template <typename Derived>
3614 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3615     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3616   if (Var) {
3617     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3618         getDerived().TransformDefinition(Var->getLocation(), Var));
3619
3620     if (!ConditionVar)
3621       return Sema::ConditionError();
3622
3623     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3624   }
3625
3626   if (Expr) {
3627     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3628
3629     if (CondExpr.isInvalid())
3630       return Sema::ConditionError();
3631
3632     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3633   }
3634
3635   return Sema::ConditionResult();
3636 }
3637
3638 template<typename Derived>
3639 NestedNameSpecifierLoc
3640 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3641                                                     NestedNameSpecifierLoc NNS,
3642                                                      QualType ObjectType,
3643                                              NamedDecl *FirstQualifierInScope) {
3644   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3645   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3646        Qualifier = Qualifier.getPrefix())
3647     Qualifiers.push_back(Qualifier);
3648
3649   CXXScopeSpec SS;
3650   while (!Qualifiers.empty()) {
3651     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3652     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3653
3654     switch (QNNS->getKind()) {
3655     case NestedNameSpecifier::Identifier: {
3656       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3657                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3658       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3659                                               SS, FirstQualifierInScope, false))
3660         return NestedNameSpecifierLoc();
3661     }
3662       break;
3663
3664     case NestedNameSpecifier::Namespace: {
3665       NamespaceDecl *NS
3666         = cast_or_null<NamespaceDecl>(
3667                                     getDerived().TransformDecl(
3668                                                           Q.getLocalBeginLoc(),
3669                                                        QNNS->getAsNamespace()));
3670       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3671       break;
3672     }
3673
3674     case NestedNameSpecifier::NamespaceAlias: {
3675       NamespaceAliasDecl *Alias
3676         = cast_or_null<NamespaceAliasDecl>(
3677                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3678                                                  QNNS->getAsNamespaceAlias()));
3679       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3680                 Q.getLocalEndLoc());
3681       break;
3682     }
3683
3684     case NestedNameSpecifier::Global:
3685       // There is no meaningful transformation that one could perform on the
3686       // global scope.
3687       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3688       break;
3689
3690     case NestedNameSpecifier::Super: {
3691       CXXRecordDecl *RD =
3692           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3693               SourceLocation(), QNNS->getAsRecordDecl()));
3694       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3695       break;
3696     }
3697
3698     case NestedNameSpecifier::TypeSpecWithTemplate:
3699     case NestedNameSpecifier::TypeSpec: {
3700       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3701                                               FirstQualifierInScope, SS);
3702
3703       if (!TL)
3704         return NestedNameSpecifierLoc();
3705
3706       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3707           (SemaRef.getLangOpts().CPlusPlus11 &&
3708            TL.getType()->isEnumeralType())) {
3709         assert(!TL.getType().hasLocalQualifiers() &&
3710                "Can't get cv-qualifiers here");
3711         if (TL.getType()->isEnumeralType())
3712           SemaRef.Diag(TL.getBeginLoc(),
3713                        diag::warn_cxx98_compat_enum_nested_name_spec);
3714         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3715                   Q.getLocalEndLoc());
3716         break;
3717       }
3718       // If the nested-name-specifier is an invalid type def, don't emit an
3719       // error because a previous error should have already been emitted.
3720       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3721       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3722         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3723           << TL.getType() << SS.getRange();
3724       }
3725       return NestedNameSpecifierLoc();
3726     }
3727     }
3728
3729     // The qualifier-in-scope and object type only apply to the leftmost entity.
3730     FirstQualifierInScope = nullptr;
3731     ObjectType = QualType();
3732   }
3733
3734   // Don't rebuild the nested-name-specifier if we don't have to.
3735   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3736       !getDerived().AlwaysRebuild())
3737     return NNS;
3738
3739   // If we can re-use the source-location data from the original
3740   // nested-name-specifier, do so.
3741   if (SS.location_size() == NNS.getDataLength() &&
3742       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3743     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3744
3745   // Allocate new nested-name-specifier location information.
3746   return SS.getWithLocInContext(SemaRef.Context);
3747 }
3748
3749 template<typename Derived>
3750 DeclarationNameInfo
3751 TreeTransform<Derived>
3752 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3753   DeclarationName Name = NameInfo.getName();
3754   if (!Name)
3755     return DeclarationNameInfo();
3756
3757   switch (Name.getNameKind()) {
3758   case DeclarationName::Identifier:
3759   case DeclarationName::ObjCZeroArgSelector:
3760   case DeclarationName::ObjCOneArgSelector:
3761   case DeclarationName::ObjCMultiArgSelector:
3762   case DeclarationName::CXXOperatorName:
3763   case DeclarationName::CXXLiteralOperatorName:
3764   case DeclarationName::CXXUsingDirective:
3765     return NameInfo;
3766
3767   case DeclarationName::CXXDeductionGuideName: {
3768     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3769     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3770         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3771     if (!NewTemplate)
3772       return DeclarationNameInfo();
3773
3774     DeclarationNameInfo NewNameInfo(NameInfo);
3775     NewNameInfo.setName(
3776         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3777     return NewNameInfo;
3778   }
3779
3780   case DeclarationName::CXXConstructorName:
3781   case DeclarationName::CXXDestructorName:
3782   case DeclarationName::CXXConversionFunctionName: {
3783     TypeSourceInfo *NewTInfo;
3784     CanQualType NewCanTy;
3785     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3786       NewTInfo = getDerived().TransformType(OldTInfo);
3787       if (!NewTInfo)
3788         return DeclarationNameInfo();
3789       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3790     }
3791     else {
3792       NewTInfo = nullptr;
3793       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3794       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3795       if (NewT.isNull())
3796         return DeclarationNameInfo();
3797       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3798     }
3799
3800     DeclarationName NewName
3801       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3802                                                            NewCanTy);
3803     DeclarationNameInfo NewNameInfo(NameInfo);
3804     NewNameInfo.setName(NewName);
3805     NewNameInfo.setNamedTypeInfo(NewTInfo);
3806     return NewNameInfo;
3807   }
3808   }
3809
3810   llvm_unreachable("Unknown name kind.");
3811 }
3812
3813 template<typename Derived>
3814 TemplateName
3815 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3816                                               TemplateName Name,
3817                                               SourceLocation NameLoc,
3818                                               QualType ObjectType,
3819                                               NamedDecl *FirstQualifierInScope,
3820                                               bool AllowInjectedClassName) {
3821   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3822     TemplateDecl *Template = QTN->getTemplateDecl();
3823     assert(Template && "qualified template name must refer to a template");
3824
3825     TemplateDecl *TransTemplate
3826       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3827                                                               Template));
3828     if (!TransTemplate)
3829       return TemplateName();
3830
3831     if (!getDerived().AlwaysRebuild() &&
3832         SS.getScopeRep() == QTN->getQualifier() &&
3833         TransTemplate == Template)
3834       return Name;
3835
3836     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3837                                             TransTemplate);
3838   }
3839
3840   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3841     if (SS.getScopeRep()) {
3842       // These apply to the scope specifier, not the template.
3843       ObjectType = QualType();
3844       FirstQualifierInScope = nullptr;
3845     }
3846
3847     if (!getDerived().AlwaysRebuild() &&
3848         SS.getScopeRep() == DTN->getQualifier() &&
3849         ObjectType.isNull())
3850       return Name;
3851
3852     // FIXME: Preserve the location of the "template" keyword.
3853     SourceLocation TemplateKWLoc = NameLoc;
3854
3855     if (DTN->isIdentifier()) {
3856       return getDerived().RebuildTemplateName(SS,
3857                                               TemplateKWLoc,
3858                                               *DTN->getIdentifier(),
3859                                               NameLoc,
3860                                               ObjectType,
3861                                               FirstQualifierInScope,
3862                                               AllowInjectedClassName);
3863     }
3864
3865     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3866                                             DTN->getOperator(), NameLoc,
3867                                             ObjectType, AllowInjectedClassName);
3868   }
3869
3870   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3871     TemplateDecl *TransTemplate
3872       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3873                                                               Template));
3874     if (!TransTemplate)
3875       return TemplateName();
3876
3877     if (!getDerived().AlwaysRebuild() &&
3878         TransTemplate == Template)
3879       return Name;
3880
3881     return TemplateName(TransTemplate);
3882   }
3883
3884   if (SubstTemplateTemplateParmPackStorage *SubstPack
3885       = Name.getAsSubstTemplateTemplateParmPack()) {
3886     TemplateTemplateParmDecl *TransParam
3887     = cast_or_null<TemplateTemplateParmDecl>(
3888             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3889     if (!TransParam)
3890       return TemplateName();
3891
3892     if (!getDerived().AlwaysRebuild() &&
3893         TransParam == SubstPack->getParameterPack())
3894       return Name;
3895
3896     return getDerived().RebuildTemplateName(TransParam,
3897                                             SubstPack->getArgumentPack());
3898   }
3899
3900   // These should be getting filtered out before they reach the AST.
3901   llvm_unreachable("overloaded function decl survived to here");
3902 }
3903
3904 template<typename Derived>
3905 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3906                                          const TemplateArgument &Arg,
3907                                          TemplateArgumentLoc &Output) {
3908   SourceLocation Loc = getDerived().getBaseLocation();
3909   switch (Arg.getKind()) {
3910   case TemplateArgument::Null:
3911     llvm_unreachable("null template argument in TreeTransform");
3912     break;
3913
3914   case TemplateArgument::Type:
3915     Output = TemplateArgumentLoc(Arg,
3916                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3917
3918     break;
3919
3920   case TemplateArgument::Template:
3921   case TemplateArgument::TemplateExpansion: {
3922     NestedNameSpecifierLocBuilder Builder;
3923     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3924     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3925       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3926     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3927       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3928
3929     if (Arg.getKind() == TemplateArgument::Template)
3930       Output = TemplateArgumentLoc(Arg,
3931                                    Builder.getWithLocInContext(SemaRef.Context),
3932                                    Loc);
3933     else
3934       Output = TemplateArgumentLoc(Arg,
3935                                    Builder.getWithLocInContext(SemaRef.Context),
3936                                    Loc, Loc);
3937
3938     break;
3939   }
3940
3941   case TemplateArgument::Expression:
3942     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3943     break;
3944
3945   case TemplateArgument::Declaration:
3946   case TemplateArgument::Integral:
3947   case TemplateArgument::Pack:
3948   case TemplateArgument::NullPtr:
3949     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3950     break;
3951   }
3952 }
3953
3954 template<typename Derived>
3955 bool TreeTransform<Derived>::TransformTemplateArgument(
3956                                          const TemplateArgumentLoc &Input,
3957                                          TemplateArgumentLoc &Output, bool Uneval) {
3958   const TemplateArgument &Arg = Input.getArgument();
3959   switch (Arg.getKind()) {
3960   case TemplateArgument::Null:
3961   case TemplateArgument::Integral:
3962   case TemplateArgument::Pack:
3963   case TemplateArgument::Declaration:
3964   case TemplateArgument::NullPtr:
3965     llvm_unreachable("Unexpected TemplateArgument");
3966
3967   case TemplateArgument::Type: {
3968     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3969     if (!DI)
3970       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3971
3972     DI = getDerived().TransformType(DI);
3973     if (!DI) return true;
3974
3975     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3976     return false;
3977   }
3978
3979   case TemplateArgument::Template: {
3980     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3981     if (QualifierLoc) {
3982       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3983       if (!QualifierLoc)
3984         return true;
3985     }
3986
3987     CXXScopeSpec SS;
3988     SS.Adopt(QualifierLoc);
3989     TemplateName Template
3990       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3991                                            Input.getTemplateNameLoc());
3992     if (Template.isNull())
3993       return true;
3994
3995     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3996                                  Input.getTemplateNameLoc());
3997     return false;
3998   }
3999
4000   case TemplateArgument::TemplateExpansion:
4001     llvm_unreachable("Caller should expand pack expansions");
4002
4003   case TemplateArgument::Expression: {
4004     // Template argument expressions are constant expressions.
4005     EnterExpressionEvaluationContext Unevaluated(
4006         getSema(),
4007         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4008                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4009         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4010         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4011
4012     Expr *InputExpr = Input.getSourceExpression();
4013     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4014
4015     ExprResult E = getDerived().TransformExpr(InputExpr);
4016     E = SemaRef.ActOnConstantExpression(E);
4017     if (E.isInvalid()) return true;
4018     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4019     return false;
4020   }
4021   }
4022
4023   // Work around bogus GCC warning
4024   return true;
4025 }
4026
4027 /// Iterator adaptor that invents template argument location information
4028 /// for each of the template arguments in its underlying iterator.
4029 template<typename Derived, typename InputIterator>
4030 class TemplateArgumentLocInventIterator {
4031   TreeTransform<Derived> &Self;
4032   InputIterator Iter;
4033
4034 public:
4035   typedef TemplateArgumentLoc value_type;
4036   typedef TemplateArgumentLoc reference;
4037   typedef typename std::iterator_traits<InputIterator>::difference_type
4038     difference_type;
4039   typedef std::input_iterator_tag iterator_category;
4040
4041   class pointer {
4042     TemplateArgumentLoc Arg;
4043
4044   public:
4045     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4046
4047     const TemplateArgumentLoc *operator->() const { return &Arg; }
4048   };
4049
4050   TemplateArgumentLocInventIterator() { }
4051
4052   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4053                                              InputIterator Iter)
4054     : Self(Self), Iter(Iter) { }
4055
4056   TemplateArgumentLocInventIterator &operator++() {
4057     ++Iter;
4058     return *this;
4059   }
4060
4061   TemplateArgumentLocInventIterator operator++(int) {
4062     TemplateArgumentLocInventIterator Old(*this);
4063     ++(*this);
4064     return Old;
4065   }
4066
4067   reference operator*() const {
4068     TemplateArgumentLoc Result;
4069     Self.InventTemplateArgumentLoc(*Iter, Result);
4070     return Result;
4071   }
4072
4073   pointer operator->() const { return pointer(**this); }
4074
4075   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4076                          const TemplateArgumentLocInventIterator &Y) {
4077     return X.Iter == Y.Iter;
4078   }
4079
4080   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4081                          const TemplateArgumentLocInventIterator &Y) {
4082     return X.Iter != Y.Iter;
4083   }
4084 };
4085
4086 template<typename Derived>
4087 template<typename InputIterator>
4088 bool TreeTransform<Derived>::TransformTemplateArguments(
4089     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4090     bool Uneval) {
4091   for (; First != Last; ++First) {
4092     TemplateArgumentLoc Out;
4093     TemplateArgumentLoc In = *First;
4094
4095     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4096       // Unpack argument packs, which we translate them into separate
4097       // arguments.
4098       // FIXME: We could do much better if we could guarantee that the
4099       // TemplateArgumentLocInfo for the pack expansion would be usable for
4100       // all of the template arguments in the argument pack.
4101       typedef TemplateArgumentLocInventIterator<Derived,
4102                                                 TemplateArgument::pack_iterator>
4103         PackLocIterator;
4104       if (TransformTemplateArguments(PackLocIterator(*this,
4105                                                  In.getArgument().pack_begin()),
4106                                      PackLocIterator(*this,
4107                                                    In.getArgument().pack_end()),
4108                                      Outputs, Uneval))
4109         return true;
4110
4111       continue;
4112     }
4113
4114     if (In.getArgument().isPackExpansion()) {
4115       // We have a pack expansion, for which we will be substituting into
4116       // the pattern.
4117       SourceLocation Ellipsis;
4118       Optional<unsigned> OrigNumExpansions;
4119       TemplateArgumentLoc Pattern
4120         = getSema().getTemplateArgumentPackExpansionPattern(
4121               In, Ellipsis, OrigNumExpansions);
4122
4123       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4124       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4125       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4126
4127       // Determine whether the set of unexpanded parameter packs can and should
4128       // be expanded.
4129       bool Expand = true;
4130       bool RetainExpansion = false;
4131       Optional<unsigned> NumExpansions = OrigNumExpansions;
4132       if (getDerived().TryExpandParameterPacks(Ellipsis,
4133                                                Pattern.getSourceRange(),
4134                                                Unexpanded,
4135                                                Expand,
4136                                                RetainExpansion,
4137                                                NumExpansions))
4138         return true;
4139
4140       if (!Expand) {
4141         // The transform has determined that we should perform a simple
4142         // transformation on the pack expansion, producing another pack
4143         // expansion.
4144         TemplateArgumentLoc OutPattern;
4145         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4146         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4147           return true;
4148
4149         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4150                                                 NumExpansions);
4151         if (Out.getArgument().isNull())
4152           return true;
4153
4154         Outputs.addArgument(Out);
4155         continue;
4156       }
4157
4158       // The transform has determined that we should perform an elementwise
4159       // expansion of the pattern. Do so.
4160       for (unsigned I = 0; I != *NumExpansions; ++I) {
4161         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4162
4163         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4164           return true;
4165
4166         if (Out.getArgument().containsUnexpandedParameterPack()) {
4167           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4168                                                   OrigNumExpansions);
4169           if (Out.getArgument().isNull())
4170             return true;
4171         }
4172
4173         Outputs.addArgument(Out);
4174       }
4175
4176       // If we're supposed to retain a pack expansion, do so by temporarily
4177       // forgetting the partially-substituted parameter pack.
4178       if (RetainExpansion) {
4179         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4180
4181         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4182           return true;
4183
4184         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4185                                                 OrigNumExpansions);
4186         if (Out.getArgument().isNull())
4187           return true;
4188
4189         Outputs.addArgument(Out);
4190       }
4191
4192       continue;
4193     }
4194
4195     // The simple case:
4196     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4197       return true;
4198
4199     Outputs.addArgument(Out);
4200   }
4201
4202   return false;
4203
4204 }
4205
4206 //===----------------------------------------------------------------------===//
4207 // Type transformation
4208 //===----------------------------------------------------------------------===//
4209
4210 template<typename Derived>
4211 QualType TreeTransform<Derived>::TransformType(QualType T) {
4212   if (getDerived().AlreadyTransformed(T))
4213     return T;
4214
4215   // Temporary workaround.  All of these transformations should
4216   // eventually turn into transformations on TypeLocs.
4217   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4218                                                 getDerived().getBaseLocation());
4219
4220   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4221
4222   if (!NewDI)
4223     return QualType();
4224
4225   return NewDI->getType();
4226 }
4227
4228 template<typename Derived>
4229 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4230   // Refine the base location to the type's location.
4231   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4232                        getDerived().getBaseEntity());
4233   if (getDerived().AlreadyTransformed(DI->getType()))
4234     return DI;
4235
4236   TypeLocBuilder TLB;
4237
4238   TypeLoc TL = DI->getTypeLoc();
4239   TLB.reserve(TL.getFullDataSize());
4240
4241   QualType Result = getDerived().TransformType(TLB, TL);
4242   if (Result.isNull())
4243     return nullptr;
4244
4245   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4246 }
4247
4248 template<typename Derived>
4249 QualType
4250 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4251   switch (T.getTypeLocClass()) {
4252 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4253 #define TYPELOC(CLASS, PARENT)                                                 \
4254   case TypeLoc::CLASS:                                                         \
4255     return getDerived().Transform##CLASS##Type(TLB,                            \
4256                                                T.castAs<CLASS##TypeLoc>());
4257 #include "clang/AST/TypeLocNodes.def"
4258   }
4259
4260   llvm_unreachable("unhandled type loc!");
4261 }
4262
4263 template<typename Derived>
4264 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4265   if (!isa<DependentNameType>(T))
4266     return TransformType(T);
4267
4268   if (getDerived().AlreadyTransformed(T))
4269     return T;
4270   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4271                                                 getDerived().getBaseLocation());
4272   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4273   return NewDI ? NewDI->getType() : QualType();
4274 }
4275
4276 template<typename Derived>
4277 TypeSourceInfo *
4278 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4279   if (!isa<DependentNameType>(DI->getType()))
4280     return TransformType(DI);
4281
4282   // Refine the base location to the type's location.
4283   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4284                        getDerived().getBaseEntity());
4285   if (getDerived().AlreadyTransformed(DI->getType()))
4286     return DI;
4287
4288   TypeLocBuilder TLB;
4289
4290   TypeLoc TL = DI->getTypeLoc();
4291   TLB.reserve(TL.getFullDataSize());
4292
4293   auto QTL = TL.getAs<QualifiedTypeLoc>();
4294   if (QTL)
4295     TL = QTL.getUnqualifiedLoc();
4296
4297   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4298
4299   QualType Result = getDerived().TransformDependentNameType(
4300       TLB, DNTL, /*DeducedTSTContext*/true);
4301   if (Result.isNull())
4302     return nullptr;
4303
4304   if (QTL) {
4305     Result = getDerived().RebuildQualifiedType(Result, QTL);
4306     if (Result.isNull())
4307       return nullptr;
4308     TLB.TypeWasModifiedSafely(Result);
4309   }
4310
4311   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4312 }
4313
4314 template<typename Derived>
4315 QualType
4316 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4317                                                QualifiedTypeLoc T) {
4318   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4319   if (Result.isNull())
4320     return QualType();
4321
4322   Result = getDerived().RebuildQualifiedType(Result, T);
4323
4324   if (Result.isNull())
4325     return QualType();
4326
4327   // RebuildQualifiedType might have updated the type, but not in a way
4328   // that invalidates the TypeLoc. (There's no location information for
4329   // qualifiers.)
4330   TLB.TypeWasModifiedSafely(Result);
4331
4332   return Result;
4333 }
4334
4335 template <typename Derived>
4336 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4337                                                       QualifiedTypeLoc TL) {
4338
4339   SourceLocation Loc = TL.getBeginLoc();
4340   Qualifiers Quals = TL.getType().getLocalQualifiers();
4341
4342   if (((T.getAddressSpace() != LangAS::Default &&
4343         Quals.getAddressSpace() != LangAS::Default)) &&
4344       T.getAddressSpace() != Quals.getAddressSpace()) {
4345     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4346         << TL.getType() << T;
4347     return QualType();
4348   }
4349
4350   // C++ [dcl.fct]p7:
4351   //   [When] adding cv-qualifications on top of the function type [...] the
4352   //   cv-qualifiers are ignored.
4353   if (T->isFunctionType()) {
4354     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4355                                                      Quals.getAddressSpace());
4356     return T;
4357   }
4358
4359   // C++ [dcl.ref]p1:
4360   //   when the cv-qualifiers are introduced through the use of a typedef-name
4361   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4362   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4363   // applied to a reference type.
4364   if (T->isReferenceType()) {
4365     // The only qualifier that applies to a reference type is restrict.
4366     if (!Quals.hasRestrict())
4367       return T;
4368     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4369   }
4370
4371   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4372   // resulting type.
4373   if (Quals.hasObjCLifetime()) {
4374     if (!T->isObjCLifetimeType() && !T->isDependentType())
4375       Quals.removeObjCLifetime();
4376     else if (T.getObjCLifetime()) {
4377       // Objective-C ARC:
4378       //   A lifetime qualifier applied to a substituted template parameter
4379       //   overrides the lifetime qualifier from the template argument.
4380       const AutoType *AutoTy;
4381       if (const SubstTemplateTypeParmType *SubstTypeParam
4382                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4383         QualType Replacement = SubstTypeParam->getReplacementType();
4384         Qualifiers Qs = Replacement.getQualifiers();
4385         Qs.removeObjCLifetime();
4386         Replacement = SemaRef.Context.getQualifiedType(
4387             Replacement.getUnqualifiedType(), Qs);
4388         T = SemaRef.Context.getSubstTemplateTypeParmType(
4389             SubstTypeParam->getReplacedParameter(), Replacement);
4390       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4391         // 'auto' types behave the same way as template parameters.
4392         QualType Deduced = AutoTy->getDeducedType();
4393         Qualifiers Qs = Deduced.getQualifiers();
4394         Qs.removeObjCLifetime();
4395         Deduced =
4396             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4397         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4398                                         AutoTy->isDependentType());
4399       } else {
4400         // Otherwise, complain about the addition of a qualifier to an
4401         // already-qualified type.
4402         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4403         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4404         Quals.removeObjCLifetime();
4405       }
4406     }
4407   }
4408
4409   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4410 }
4411
4412 template<typename Derived>
4413 TypeLoc
4414 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4415                                                    QualType ObjectType,
4416                                                    NamedDecl *UnqualLookup,
4417                                                    CXXScopeSpec &SS) {
4418   if (getDerived().AlreadyTransformed(TL.getType()))
4419     return TL;
4420
4421   TypeSourceInfo *TSI =
4422       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4423   if (TSI)
4424     return TSI->getTypeLoc();
4425   return TypeLoc();
4426 }
4427
4428 template<typename Derived>
4429 TypeSourceInfo *
4430 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4431                                                    QualType ObjectType,
4432                                                    NamedDecl *UnqualLookup,
4433                                                    CXXScopeSpec &SS) {
4434   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4435     return TSInfo;
4436
4437   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4438                                    UnqualLookup, SS);
4439 }
4440
4441 template <typename Derived>
4442 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4443     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4444     CXXScopeSpec &SS) {
4445   QualType T = TL.getType();
4446   assert(!getDerived().AlreadyTransformed(T));
4447
4448   TypeLocBuilder TLB;
4449   QualType Result;
4450
4451   if (isa<TemplateSpecializationType>(T)) {
4452     TemplateSpecializationTypeLoc SpecTL =
4453         TL.castAs<TemplateSpecializationTypeLoc>();
4454
4455     TemplateName Template = getDerived().TransformTemplateName(
4456         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4457         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4458     if (Template.isNull())
4459       return nullptr;
4460
4461     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4462                                                               Template);
4463   } else if (isa<DependentTemplateSpecializationType>(T)) {
4464     DependentTemplateSpecializationTypeLoc SpecTL =
4465         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4466
4467     TemplateName Template
4468       = getDerived().RebuildTemplateName(SS,
4469                                          SpecTL.getTemplateKeywordLoc(),
4470                                          *SpecTL.getTypePtr()->getIdentifier(),
4471                                          SpecTL.getTemplateNameLoc(),
4472                                          ObjectType, UnqualLookup,
4473                                          /*AllowInjectedClassName*/true);
4474     if (Template.isNull())
4475       return nullptr;
4476
4477     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4478                                                                        SpecTL,
4479                                                                        Template,
4480                                                                        SS);
4481   } else {
4482     // Nothing special needs to be done for these.
4483     Result = getDerived().TransformType(TLB, TL);
4484   }
4485
4486   if (Result.isNull())
4487     return nullptr;
4488
4489   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4490 }
4491
4492 template <class TyLoc> static inline
4493 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4494   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4495   NewT.setNameLoc(T.getNameLoc());
4496   return T.getType();
4497 }
4498
4499 template<typename Derived>
4500 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4501                                                       BuiltinTypeLoc T) {
4502   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4503   NewT.setBuiltinLoc(T.getBuiltinLoc());
4504   if (T.needsExtraLocalData())
4505     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4506   return T.getType();
4507 }
4508
4509 template<typename Derived>
4510 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4511                                                       ComplexTypeLoc T) {
4512   // FIXME: recurse?
4513   return TransformTypeSpecType(TLB, T);
4514 }
4515
4516 template <typename Derived>
4517 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4518                                                        AdjustedTypeLoc TL) {
4519   // Adjustments applied during transformation are handled elsewhere.
4520   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4521 }
4522
4523 template<typename Derived>
4524 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4525                                                       DecayedTypeLoc TL) {
4526   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4527   if (OriginalType.isNull())
4528     return QualType();
4529
4530   QualType Result = TL.getType();
4531   if (getDerived().AlwaysRebuild() ||
4532       OriginalType != TL.getOriginalLoc().getType())
4533     Result = SemaRef.Context.getDecayedType(OriginalType);
4534   TLB.push<DecayedTypeLoc>(Result);
4535   // Nothing to set for DecayedTypeLoc.
4536   return Result;
4537 }
4538
4539 /// Helper to deduce addr space of a pointee type in OpenCL mode.
4540 /// If the type is updated it will be overwritten in PointeeType param.
4541 static void deduceOpenCLPointeeAddrSpace(Sema &SemaRef, QualType &PointeeType) {
4542   if (PointeeType.getAddressSpace() == LangAS::Default)
4543     PointeeType = SemaRef.Context.getAddrSpaceQualType(PointeeType,
4544                                                        LangAS::opencl_generic);
4545 }
4546
4547 template<typename Derived>
4548 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4549                                                       PointerTypeLoc TL) {
4550   QualType PointeeType
4551     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4552   if (PointeeType.isNull())
4553     return QualType();
4554
4555   if (SemaRef.getLangOpts().OpenCL)
4556     deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType);
4557
4558   QualType Result = TL.getType();
4559   if (PointeeType->getAs<ObjCObjectType>()) {
4560     // A dependent pointer type 'T *' has is being transformed such
4561     // that an Objective-C class type is being replaced for 'T'. The
4562     // resulting pointer type is an ObjCObjectPointerType, not a
4563     // PointerType.
4564     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4565
4566     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4567     NewT.setStarLoc(TL.getStarLoc());
4568     return Result;
4569   }
4570
4571   if (getDerived().AlwaysRebuild() ||
4572       PointeeType != TL.getPointeeLoc().getType()) {
4573     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4574     if (Result.isNull())
4575       return QualType();
4576   }
4577
4578   // Objective-C ARC can add lifetime qualifiers to the type that we're
4579   // pointing to.
4580   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4581
4582   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4583   NewT.setSigilLoc(TL.getSigilLoc());
4584   return Result;
4585 }
4586
4587 template<typename Derived>
4588 QualType
4589 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4590                                                   BlockPointerTypeLoc TL) {
4591   QualType PointeeType
4592     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4593   if (PointeeType.isNull())
4594     return QualType();
4595
4596   if (SemaRef.getLangOpts().OpenCL)
4597     deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType);
4598
4599   QualType Result = TL.getType();
4600   if (getDerived().AlwaysRebuild() ||
4601       PointeeType != TL.getPointeeLoc().getType()) {
4602     Result = getDerived().RebuildBlockPointerType(PointeeType,
4603                                                   TL.getSigilLoc());
4604     if (Result.isNull())
4605       return QualType();
4606   }
4607
4608   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4609   NewT.setSigilLoc(TL.getSigilLoc());
4610   return Result;
4611 }
4612
4613 /// Transforms a reference type.  Note that somewhat paradoxically we
4614 /// don't care whether the type itself is an l-value type or an r-value
4615 /// type;  we only care if the type was *written* as an l-value type
4616 /// or an r-value type.
4617 template<typename Derived>
4618 QualType
4619 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4620                                                ReferenceTypeLoc TL) {
4621   const ReferenceType *T = TL.getTypePtr();
4622
4623   // Note that this works with the pointee-as-written.
4624   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4625   if (PointeeType.isNull())
4626     return QualType();
4627
4628   if (SemaRef.getLangOpts().OpenCL)
4629     deduceOpenCLPointeeAddrSpace(SemaRef, PointeeType);
4630
4631   QualType Result = TL.getType();
4632   if (getDerived().AlwaysRebuild() ||
4633       PointeeType != T->getPointeeTypeAsWritten()) {
4634     Result = getDerived().RebuildReferenceType(PointeeType,
4635                                                T->isSpelledAsLValue(),
4636                                                TL.getSigilLoc());
4637     if (Result.isNull())
4638       return QualType();
4639   }
4640
4641   // Objective-C ARC can add lifetime qualifiers to the type that we're
4642   // referring to.
4643   TLB.TypeWasModifiedSafely(
4644                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4645
4646   // r-value references can be rebuilt as l-value references.
4647   ReferenceTypeLoc NewTL;
4648   if (isa<LValueReferenceType>(Result))
4649     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4650   else
4651     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4652   NewTL.setSigilLoc(TL.getSigilLoc());
4653
4654   return Result;
4655 }
4656
4657 template<typename Derived>
4658 QualType
4659 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4660                                                  LValueReferenceTypeLoc TL) {
4661   return TransformReferenceType(TLB, TL);
4662 }
4663
4664 template<typename Derived>
4665 QualType
4666 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4667                                                  RValueReferenceTypeLoc TL) {
4668   return TransformReferenceType(TLB, TL);
4669 }
4670
4671 template<typename Derived>
4672 QualType
4673 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4674                                                    MemberPointerTypeLoc TL) {
4675   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4676   if (PointeeType.isNull())
4677     return QualType();
4678
4679   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4680   TypeSourceInfo *NewClsTInfo = nullptr;
4681   if (OldClsTInfo) {
4682     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4683     if (!NewClsTInfo)
4684       return QualType();
4685   }
4686
4687   const MemberPointerType *T = TL.getTypePtr();
4688   QualType OldClsType = QualType(T->getClass(), 0);
4689   QualType NewClsType;
4690   if (NewClsTInfo)
4691     NewClsType = NewClsTInfo->getType();
4692   else {
4693     NewClsType = getDerived().TransformType(OldClsType);
4694     if (NewClsType.isNull())
4695       return QualType();
4696   }
4697
4698   QualType Result = TL.getType();
4699   if (getDerived().AlwaysRebuild() ||
4700       PointeeType != T->getPointeeType() ||
4701       NewClsType != OldClsType) {
4702     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4703                                                    TL.getStarLoc());
4704     if (Result.isNull())
4705       return QualType();
4706   }
4707
4708   // If we had to adjust the pointee type when building a member pointer, make
4709   // sure to push TypeLoc info for it.
4710   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4711   if (MPT && PointeeType != MPT->getPointeeType()) {
4712     assert(isa<AdjustedType>(MPT->getPointeeType()));
4713     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4714   }
4715
4716   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4717   NewTL.setSigilLoc(TL.getSigilLoc());
4718   NewTL.setClassTInfo(NewClsTInfo);
4719
4720   return Result;
4721 }
4722
4723 template<typename Derived>
4724 QualType
4725 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4726                                                    ConstantArrayTypeLoc TL) {
4727   const ConstantArrayType *T = TL.getTypePtr();
4728   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4729   if (ElementType.isNull())
4730     return QualType();
4731
4732   QualType Result = TL.getType();
4733   if (getDerived().AlwaysRebuild() ||
4734       ElementType != T->getElementType()) {
4735     Result = getDerived().RebuildConstantArrayType(ElementType,
4736                                                    T->getSizeModifier(),
4737                                                    T->getSize(),
4738                                              T->getIndexTypeCVRQualifiers(),
4739                                                    TL.getBracketsRange());
4740     if (Result.isNull())
4741       return QualType();
4742   }
4743
4744   // We might have either a ConstantArrayType or a VariableArrayType now:
4745   // a ConstantArrayType is allowed to have an element type which is a
4746   // VariableArrayType if the type is dependent.  Fortunately, all array
4747   // types have the same location layout.
4748   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4749   NewTL.setLBracketLoc(TL.getLBracketLoc());
4750   NewTL.setRBracketLoc(TL.getRBracketLoc());
4751
4752   Expr *Size = TL.getSizeExpr();
4753   if (Size) {
4754     EnterExpressionEvaluationContext Unevaluated(
4755         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4756     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4757     Size = SemaRef.ActOnConstantExpression(Size).get();
4758   }
4759   NewTL.setSizeExpr(Size);
4760
4761   return Result;
4762 }
4763
4764 template<typename Derived>
4765 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4766                                               TypeLocBuilder &TLB,
4767                                               IncompleteArrayTypeLoc TL) {
4768   const IncompleteArrayType *T = TL.getTypePtr();
4769   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4770   if (ElementType.isNull())
4771     return QualType();
4772
4773   QualType Result = TL.getType();
4774   if (getDerived().AlwaysRebuild() ||
4775       ElementType != T->getElementType()) {
4776     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4777                                                      T->getSizeModifier(),
4778                                            T->getIndexTypeCVRQualifiers(),
4779                                                      TL.getBracketsRange());
4780     if (Result.isNull())
4781       return QualType();
4782   }
4783
4784   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4785   NewTL.setLBracketLoc(TL.getLBracketLoc());
4786   NewTL.setRBracketLoc(TL.getRBracketLoc());
4787   NewTL.setSizeExpr(nullptr);
4788
4789   return Result;
4790 }
4791
4792 template<typename Derived>
4793 QualType
4794 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4795                                                    VariableArrayTypeLoc TL) {
4796   const VariableArrayType *T = TL.getTypePtr();
4797   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4798   if (ElementType.isNull())
4799     return QualType();
4800
4801   ExprResult SizeResult;
4802   {
4803     EnterExpressionEvaluationContext Context(
4804         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4805     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4806   }
4807   if (SizeResult.isInvalid())
4808     return QualType();
4809   SizeResult =
4810       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4811   if (SizeResult.isInvalid())
4812     return QualType();
4813
4814   Expr *Size = SizeResult.get();
4815
4816   QualType Result = TL.getType();
4817   if (getDerived().AlwaysRebuild() ||
4818       ElementType != T->getElementType() ||
4819       Size != T->getSizeExpr()) {
4820     Result = getDerived().RebuildVariableArrayType(ElementType,
4821                                                    T->getSizeModifier(),
4822                                                    Size,
4823                                              T->getIndexTypeCVRQualifiers(),
4824                                                    TL.getBracketsRange());
4825     if (Result.isNull())
4826       return QualType();
4827   }
4828
4829   // We might have constant size array now, but fortunately it has the same
4830   // location layout.
4831   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4832   NewTL.setLBracketLoc(TL.getLBracketLoc());
4833   NewTL.setRBracketLoc(TL.getRBracketLoc());
4834   NewTL.setSizeExpr(Size);
4835
4836   return Result;
4837 }
4838
4839 template<typename Derived>
4840 QualType
4841 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4842                                              DependentSizedArrayTypeLoc TL) {
4843   const DependentSizedArrayType *T = TL.getTypePtr();
4844   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4845   if (ElementType.isNull())
4846     return QualType();
4847
4848   // Array bounds are constant expressions.
4849   EnterExpressionEvaluationContext Unevaluated(
4850       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4851
4852   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4853   Expr *origSize = TL.getSizeExpr();
4854   if (!origSize) origSize = T->getSizeExpr();
4855
4856   ExprResult sizeResult
4857     = getDerived().TransformExpr(origSize);
4858   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4859   if (sizeResult.isInvalid())
4860     return QualType();
4861
4862   Expr *size = sizeResult.get();
4863
4864   QualType Result = TL.getType();
4865   if (getDerived().AlwaysRebuild() ||
4866       ElementType != T->getElementType() ||
4867       size != origSize) {
4868     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4869                                                          T->getSizeModifier(),
4870                                                          size,
4871                                                 T->getIndexTypeCVRQualifiers(),
4872                                                         TL.getBracketsRange());
4873     if (Result.isNull())
4874       return QualType();
4875   }
4876
4877   // We might have any sort of array type now, but fortunately they
4878   // all have the same location layout.
4879   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4880   NewTL.setLBracketLoc(TL.getLBracketLoc());
4881   NewTL.setRBracketLoc(TL.getRBracketLoc());
4882   NewTL.setSizeExpr(size);
4883
4884   return Result;
4885 }
4886
4887 template <typename Derived>
4888 QualType TreeTransform<Derived>::TransformDependentVectorType(
4889     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
4890   const DependentVectorType *T = TL.getTypePtr();
4891   QualType ElementType = getDerived().TransformType(T->getElementType());
4892   if (ElementType.isNull())
4893     return QualType();
4894
4895   EnterExpressionEvaluationContext Unevaluated(
4896       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4897
4898   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4899   Size = SemaRef.ActOnConstantExpression(Size);
4900   if (Size.isInvalid())
4901     return QualType();
4902
4903   QualType Result = TL.getType();
4904   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
4905       Size.get() != T->getSizeExpr()) {
4906     Result = getDerived().RebuildDependentVectorType(
4907         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
4908     if (Result.isNull())
4909       return QualType();
4910   }
4911
4912   // Result might be dependent or not.
4913   if (isa<DependentVectorType>(Result)) {
4914     DependentVectorTypeLoc NewTL =
4915         TLB.push<DependentVectorTypeLoc>(Result);
4916     NewTL.setNameLoc(TL.getNameLoc());
4917   } else {
4918     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4919     NewTL.setNameLoc(TL.getNameLoc());
4920   }
4921
4922   return Result;
4923 }
4924
4925 template<typename Derived>
4926 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4927                                       TypeLocBuilder &TLB,
4928                                       DependentSizedExtVectorTypeLoc TL) {
4929   const DependentSizedExtVectorType *T = TL.getTypePtr();
4930
4931   // FIXME: ext vector locs should be nested
4932   QualType ElementType = getDerived().TransformType(T->getElementType());
4933   if (ElementType.isNull())
4934     return QualType();
4935
4936   // Vector sizes are constant expressions.
4937   EnterExpressionEvaluationContext Unevaluated(
4938       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4939
4940   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4941   Size = SemaRef.ActOnConstantExpression(Size);
4942   if (Size.isInvalid())
4943     return QualType();
4944
4945   QualType Result = TL.getType();
4946   if (getDerived().AlwaysRebuild() ||
4947       ElementType != T->getElementType() ||
4948       Size.get() != T->getSizeExpr()) {
4949     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4950                                                              Size.get(),
4951                                                          T->getAttributeLoc());
4952     if (Result.isNull())
4953       return QualType();
4954   }
4955
4956   // Result might be dependent or not.
4957   if (isa<DependentSizedExtVectorType>(Result)) {
4958     DependentSizedExtVectorTypeLoc NewTL
4959       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4960     NewTL.setNameLoc(TL.getNameLoc());
4961   } else {
4962     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4963     NewTL.setNameLoc(TL.getNameLoc());
4964   }
4965
4966   return Result;
4967 }
4968
4969 template <typename Derived>
4970 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
4971     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
4972   const DependentAddressSpaceType *T = TL.getTypePtr();
4973
4974   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
4975
4976   if (pointeeType.isNull())
4977     return QualType();
4978
4979   // Address spaces are constant expressions.
4980   EnterExpressionEvaluationContext Unevaluated(
4981       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4982
4983   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
4984   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
4985   if (AddrSpace.isInvalid())
4986     return QualType();
4987
4988   QualType Result = TL.getType();
4989   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
4990       AddrSpace.get() != T->getAddrSpaceExpr()) {
4991     Result = getDerived().RebuildDependentAddressSpaceType(
4992         pointeeType, AddrSpace.get(), T->getAttributeLoc());
4993     if (Result.isNull())
4994       return QualType();
4995   }
4996
4997   // Result might be dependent or not.
4998   if (isa<DependentAddressSpaceType>(Result)) {
4999     DependentAddressSpaceTypeLoc NewTL =
5000         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5001
5002     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5003     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5004     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5005
5006   } else {
5007     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5008         Result, getDerived().getBaseLocation());
5009     TransformType(TLB, DI->getTypeLoc());
5010   }
5011
5012   return Result;
5013 }
5014
5015 template <typename Derived>
5016 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5017                                                      VectorTypeLoc TL) {
5018   const VectorType *T = TL.getTypePtr();
5019   QualType ElementType = getDerived().TransformType(T->getElementType());
5020   if (ElementType.isNull())
5021     return QualType();
5022
5023   QualType Result = TL.getType();
5024   if (getDerived().AlwaysRebuild() ||
5025       ElementType != T->getElementType()) {
5026     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5027                                             T->getVectorKind());
5028     if (Result.isNull())
5029       return QualType();
5030   }
5031
5032   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5033   NewTL.setNameLoc(TL.getNameLoc());
5034
5035   return Result;
5036 }
5037
5038 template<typename Derived>
5039 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5040                                                         ExtVectorTypeLoc TL) {
5041   const VectorType *T = TL.getTypePtr();
5042   QualType ElementType = getDerived().TransformType(T->getElementType());
5043   if (ElementType.isNull())
5044     return QualType();
5045
5046   QualType Result = TL.getType();
5047   if (getDerived().AlwaysRebuild() ||
5048       ElementType != T->getElementType()) {
5049     Result = getDerived().RebuildExtVectorType(ElementType,
5050                                                T->getNumElements(),
5051                                                /*FIXME*/ SourceLocation());
5052     if (Result.isNull())
5053       return QualType();
5054   }
5055
5056   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5057   NewTL.setNameLoc(TL.getNameLoc());
5058
5059   return Result;
5060 }
5061
5062 template <typename Derived>
5063 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5064     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5065     bool ExpectParameterPack) {
5066   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5067   TypeSourceInfo *NewDI = nullptr;
5068
5069   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5070     // If we're substituting into a pack expansion type and we know the
5071     // length we want to expand to, just substitute for the pattern.
5072     TypeLoc OldTL = OldDI->getTypeLoc();
5073     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5074
5075     TypeLocBuilder TLB;
5076     TypeLoc NewTL = OldDI->getTypeLoc();
5077     TLB.reserve(NewTL.getFullDataSize());
5078
5079     QualType Result = getDerived().TransformType(TLB,
5080                                                OldExpansionTL.getPatternLoc());
5081     if (Result.isNull())
5082       return nullptr;
5083
5084     Result = RebuildPackExpansionType(Result,
5085                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5086                                       OldExpansionTL.getEllipsisLoc(),
5087                                       NumExpansions);
5088     if (Result.isNull())
5089       return nullptr;
5090
5091     PackExpansionTypeLoc NewExpansionTL
5092       = TLB.push<PackExpansionTypeLoc>(Result);
5093     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5094     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5095   } else
5096     NewDI = getDerived().TransformType(OldDI);
5097   if (!NewDI)
5098     return nullptr;
5099
5100   if (NewDI == OldDI && indexAdjustment == 0)
5101     return OldParm;
5102
5103   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5104                                              OldParm->getDeclContext(),
5105                                              OldParm->getInnerLocStart(),
5106                                              OldParm->getLocation(),
5107                                              OldParm->getIdentifier(),
5108                                              NewDI->getType(),
5109                                              NewDI,
5110                                              OldParm->getStorageClass(),
5111                                              /* DefArg */ nullptr);
5112   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5113                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5114   return newParm;
5115 }
5116
5117 template <typename Derived>
5118 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5119     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5120     const QualType *ParamTypes,
5121     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5122     SmallVectorImpl<QualType> &OutParamTypes,
5123     SmallVectorImpl<ParmVarDecl *> *PVars,
5124     Sema::ExtParameterInfoBuilder &PInfos) {
5125   int indexAdjustment = 0;
5126
5127   unsigned NumParams = Params.size();
5128   for (unsigned i = 0; i != NumParams; ++i) {
5129     if (ParmVarDecl *OldParm = Params[i]) {
5130       assert(OldParm->getFunctionScopeIndex() == i);
5131
5132       Optional<unsigned> NumExpansions;
5133       ParmVarDecl *NewParm = nullptr;
5134       if (OldParm->isParameterPack()) {
5135         // We have a function parameter pack that may need to be expanded.
5136         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5137
5138         // Find the parameter packs that could be expanded.
5139         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5140         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5141         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5142         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5143         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
5144
5145         // Determine whether we should expand the parameter packs.
5146         bool ShouldExpand = false;
5147         bool RetainExpansion = false;
5148         Optional<unsigned> OrigNumExpansions =
5149             ExpansionTL.getTypePtr()->getNumExpansions();
5150         NumExpansions = OrigNumExpansions;
5151         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5152                                                  Pattern.getSourceRange(),
5153                                                  Unexpanded,
5154                                                  ShouldExpand,
5155                                                  RetainExpansion,
5156                                                  NumExpansions)) {
5157           return true;
5158         }
5159
5160         if (ShouldExpand) {
5161           // Expand the function parameter pack into multiple, separate
5162           // parameters.
5163           getDerived().ExpandingFunctionParameterPack(OldParm);
5164           for (unsigned I = 0; I != *NumExpansions; ++I) {
5165             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5166             ParmVarDecl *NewParm
5167               = getDerived().TransformFunctionTypeParam(OldParm,
5168                                                         indexAdjustment++,
5169                                                         OrigNumExpansions,
5170                                                 /*ExpectParameterPack=*/false);
5171             if (!NewParm)
5172               return true;
5173
5174             if (ParamInfos)
5175               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5176             OutParamTypes.push_back(NewParm->getType());
5177             if (PVars)
5178               PVars->push_back(NewParm);
5179           }
5180
5181           // If we're supposed to retain a pack expansion, do so by temporarily
5182           // forgetting the partially-substituted parameter pack.
5183           if (RetainExpansion) {
5184             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5185             ParmVarDecl *NewParm
5186               = getDerived().TransformFunctionTypeParam(OldParm,
5187                                                         indexAdjustment++,
5188                                                         OrigNumExpansions,
5189                                                 /*ExpectParameterPack=*/false);
5190             if (!NewParm)
5191               return true;
5192
5193             if (ParamInfos)
5194               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5195             OutParamTypes.push_back(NewParm->getType());
5196             if (PVars)
5197               PVars->push_back(NewParm);
5198           }
5199
5200           // The next parameter should have the same adjustment as the
5201           // last thing we pushed, but we post-incremented indexAdjustment
5202           // on every push.  Also, if we push nothing, the adjustment should
5203           // go down by one.
5204           indexAdjustment--;
5205
5206           // We're done with the pack expansion.
5207           continue;
5208         }
5209
5210         // We'll substitute the parameter now without expanding the pack
5211         // expansion.
5212         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5213         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5214                                                           indexAdjustment,
5215                                                           NumExpansions,
5216                                                   /*ExpectParameterPack=*/true);
5217       } else {
5218         NewParm = getDerived().TransformFunctionTypeParam(
5219             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5220       }
5221
5222       if (!NewParm)
5223         return true;
5224
5225       if (ParamInfos)
5226         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5227       OutParamTypes.push_back(NewParm->getType());
5228       if (PVars)
5229         PVars->push_back(NewParm);
5230       continue;
5231     }
5232
5233     // Deal with the possibility that we don't have a parameter
5234     // declaration for this parameter.
5235     QualType OldType = ParamTypes[i];
5236     bool IsPackExpansion = false;
5237     Optional<unsigned> NumExpansions;
5238     QualType NewType;
5239     if (const PackExpansionType *Expansion
5240                                        = dyn_cast<PackExpansionType>(OldType)) {
5241       // We have a function parameter pack that may need to be expanded.
5242       QualType Pattern = Expansion->getPattern();
5243       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5244       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5245
5246       // Determine whether we should expand the parameter packs.
5247       bool ShouldExpand = false;
5248       bool RetainExpansion = false;
5249       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5250                                                Unexpanded,
5251                                                ShouldExpand,
5252                                                RetainExpansion,
5253                                                NumExpansions)) {
5254         return true;
5255       }
5256
5257       if (ShouldExpand) {
5258         // Expand the function parameter pack into multiple, separate
5259         // parameters.
5260         for (unsigned I = 0; I != *NumExpansions; ++I) {
5261           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5262           QualType NewType = getDerived().TransformType(Pattern);
5263           if (NewType.isNull())
5264             return true;
5265
5266           if (NewType->containsUnexpandedParameterPack()) {
5267             NewType =
5268                 getSema().getASTContext().getPackExpansionType(NewType, None);
5269
5270             if (NewType.isNull())
5271               return true;
5272           }
5273
5274           if (ParamInfos)
5275             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5276           OutParamTypes.push_back(NewType);
5277           if (PVars)
5278             PVars->push_back(nullptr);
5279         }
5280
5281         // We're done with the pack expansion.
5282         continue;
5283       }
5284
5285       // If we're supposed to retain a pack expansion, do so by temporarily
5286       // forgetting the partially-substituted parameter pack.
5287       if (RetainExpansion) {
5288         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5289         QualType NewType = getDerived().TransformType(Pattern);
5290         if (NewType.isNull())
5291           return true;
5292
5293         if (ParamInfos)
5294           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5295         OutParamTypes.push_back(NewType);
5296         if (PVars)
5297           PVars->push_back(nullptr);
5298       }
5299
5300       // We'll substitute the parameter now without expanding the pack
5301       // expansion.
5302       OldType = Expansion->getPattern();
5303       IsPackExpansion = true;
5304       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5305       NewType = getDerived().TransformType(OldType);
5306     } else {
5307       NewType = getDerived().TransformType(OldType);
5308     }
5309
5310     if (NewType.isNull())
5311       return true;
5312
5313     if (IsPackExpansion)
5314       NewType = getSema().Context.getPackExpansionType(NewType,
5315                                                        NumExpansions);
5316
5317     if (ParamInfos)
5318       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5319     OutParamTypes.push_back(NewType);
5320     if (PVars)
5321       PVars->push_back(nullptr);
5322   }
5323
5324 #ifndef NDEBUG
5325   if (PVars) {
5326     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5327       if (ParmVarDecl *parm = (*PVars)[i])
5328         assert(parm->getFunctionScopeIndex() == i);
5329   }
5330 #endif
5331
5332   return false;
5333 }
5334
5335 template<typename Derived>
5336 QualType
5337 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5338                                                    FunctionProtoTypeLoc TL) {
5339   SmallVector<QualType, 4> ExceptionStorage;
5340   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5341   return getDerived().TransformFunctionProtoType(
5342       TLB, TL, nullptr, Qualifiers(),
5343       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5344         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5345                                             ExceptionStorage, Changed);
5346       });
5347 }
5348
5349 template<typename Derived> template<typename Fn>
5350 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5351     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5352     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5353
5354   // Transform the parameters and return type.
5355   //
5356   // We are required to instantiate the params and return type in source order.
5357   // When the function has a trailing return type, we instantiate the
5358   // parameters before the return type,  since the return type can then refer
5359   // to the parameters themselves (via decltype, sizeof, etc.).
5360   //
5361   SmallVector<QualType, 4> ParamTypes;
5362   SmallVector<ParmVarDecl*, 4> ParamDecls;
5363   Sema::ExtParameterInfoBuilder ExtParamInfos;
5364   const FunctionProtoType *T = TL.getTypePtr();
5365
5366   QualType ResultType;
5367
5368   if (T->hasTrailingReturn()) {
5369     if (getDerived().TransformFunctionTypeParams(
5370             TL.getBeginLoc(), TL.getParams(),
5371             TL.getTypePtr()->param_type_begin(),
5372             T->getExtParameterInfosOrNull(),
5373             ParamTypes, &ParamDecls, ExtParamInfos))
5374       return QualType();
5375
5376     {
5377       // C++11 [expr.prim.general]p3:
5378       //   If a declaration declares a member function or member function
5379       //   template of a class X, the expression this is a prvalue of type
5380       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5381       //   and the end of the function-definition, member-declarator, or
5382       //   declarator.
5383       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5384
5385       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5386       if (ResultType.isNull())
5387         return QualType();
5388     }
5389   }
5390   else {
5391     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5392     if (ResultType.isNull())
5393       return QualType();
5394
5395     if (getDerived().TransformFunctionTypeParams(
5396             TL.getBeginLoc(), TL.getParams(),
5397             TL.getTypePtr()->param_type_begin(),
5398             T->getExtParameterInfosOrNull(),
5399             ParamTypes, &ParamDecls, ExtParamInfos))
5400       return QualType();
5401   }
5402
5403   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5404
5405   bool EPIChanged = false;
5406   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5407     return QualType();
5408
5409   // Handle extended parameter information.
5410   if (auto NewExtParamInfos =
5411         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5412     if (!EPI.ExtParameterInfos ||
5413         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5414           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5415       EPIChanged = true;
5416     }
5417     EPI.ExtParameterInfos = NewExtParamInfos;
5418   } else if (EPI.ExtParameterInfos) {
5419     EPIChanged = true;
5420     EPI.ExtParameterInfos = nullptr;
5421   }
5422
5423   QualType Result = TL.getType();
5424   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5425       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5426     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5427     if (Result.isNull())
5428       return QualType();
5429   }
5430
5431   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5432   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5433   NewTL.setLParenLoc(TL.getLParenLoc());
5434   NewTL.setRParenLoc(TL.getRParenLoc());
5435   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5436   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5437   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5438     NewTL.setParam(i, ParamDecls[i]);
5439
5440   return Result;
5441 }
5442
5443 template<typename Derived>
5444 bool TreeTransform<Derived>::TransformExceptionSpec(
5445     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5446     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5447   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5448
5449   // Instantiate a dynamic noexcept expression, if any.
5450   if (isComputedNoexcept(ESI.Type)) {
5451     EnterExpressionEvaluationContext Unevaluated(
5452         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5453     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5454     if (NoexceptExpr.isInvalid())
5455       return true;
5456
5457     ExceptionSpecificationType EST = ESI.Type;
5458     NoexceptExpr =
5459         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5460     if (NoexceptExpr.isInvalid())
5461       return true;
5462
5463     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5464       Changed = true;
5465     ESI.NoexceptExpr = NoexceptExpr.get();
5466     ESI.Type = EST;
5467   }
5468
5469   if (ESI.Type != EST_Dynamic)
5470     return false;
5471
5472   // Instantiate a dynamic exception specification's type.
5473   for (QualType T : ESI.Exceptions) {
5474     if (const PackExpansionType *PackExpansion =
5475             T->getAs<PackExpansionType>()) {
5476       Changed = true;
5477
5478       // We have a pack expansion. Instantiate it.
5479       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5480       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5481                                               Unexpanded);
5482       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5483
5484       // Determine whether the set of unexpanded parameter packs can and
5485       // should
5486       // be expanded.
5487       bool Expand = false;
5488       bool RetainExpansion = false;
5489       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5490       // FIXME: Track the location of the ellipsis (and track source location
5491       // information for the types in the exception specification in general).
5492       if (getDerived().TryExpandParameterPacks(
5493               Loc, SourceRange(), Unexpanded, Expand,
5494               RetainExpansion, NumExpansions))
5495         return true;
5496
5497       if (!Expand) {
5498         // We can't expand this pack expansion into separate arguments yet;
5499         // just substitute into the pattern and create a new pack expansion
5500         // type.
5501         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5502         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5503         if (U.isNull())
5504           return true;
5505
5506         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5507         Exceptions.push_back(U);
5508         continue;
5509       }
5510
5511       // Substitute into the pack expansion pattern for each slice of the
5512       // pack.
5513       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5514         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5515
5516         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5517         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5518           return true;
5519
5520         Exceptions.push_back(U);
5521       }
5522     } else {
5523       QualType U = getDerived().TransformType(T);
5524       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5525         return true;
5526       if (T != U)
5527         Changed = true;
5528
5529       Exceptions.push_back(U);
5530     }
5531   }
5532
5533   ESI.Exceptions = Exceptions;
5534   if (ESI.Exceptions.empty())
5535     ESI.Type = EST_DynamicNone;
5536   return false;
5537 }
5538
5539 template<typename Derived>
5540 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5541                                                  TypeLocBuilder &TLB,
5542                                                  FunctionNoProtoTypeLoc TL) {
5543   const FunctionNoProtoType *T = TL.getTypePtr();
5544   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5545   if (ResultType.isNull())
5546     return QualType();
5547
5548   QualType Result = TL.getType();
5549   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5550     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5551
5552   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5553   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5554   NewTL.setLParenLoc(TL.getLParenLoc());
5555   NewTL.setRParenLoc(TL.getRParenLoc());
5556   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5557
5558   return Result;
5559 }
5560
5561 template<typename Derived> QualType
5562 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5563                                                  UnresolvedUsingTypeLoc TL) {
5564   const UnresolvedUsingType *T = TL.getTypePtr();
5565   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5566   if (!D)
5567     return QualType();
5568
5569   QualType Result = TL.getType();
5570   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5571     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5572     if (Result.isNull())
5573       return QualType();
5574   }
5575
5576   // We might get an arbitrary type spec type back.  We should at
5577   // least always get a type spec type, though.
5578   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5579   NewTL.setNameLoc(TL.getNameLoc());
5580
5581   return Result;
5582 }
5583
5584 template<typename Derived>
5585 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5586                                                       TypedefTypeLoc TL) {
5587   const TypedefType *T = TL.getTypePtr();
5588   TypedefNameDecl *Typedef
5589     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5590                                                                T->getDecl()));
5591   if (!Typedef)
5592     return QualType();
5593
5594   QualType Result = TL.getType();
5595   if (getDerived().AlwaysRebuild() ||
5596       Typedef != T->getDecl()) {
5597     Result = getDerived().RebuildTypedefType(Typedef);
5598     if (Result.isNull())
5599       return QualType();
5600   }
5601
5602   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5603   NewTL.setNameLoc(TL.getNameLoc());
5604
5605   return Result;
5606 }
5607
5608 template<typename Derived>
5609 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5610                                                       TypeOfExprTypeLoc TL) {
5611   // typeof expressions are not potentially evaluated contexts
5612   EnterExpressionEvaluationContext Unevaluated(
5613       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5614       Sema::ReuseLambdaContextDecl);
5615
5616   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5617   if (E.isInvalid())
5618     return QualType();
5619
5620   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5621   if (E.isInvalid())
5622     return QualType();
5623
5624   QualType Result = TL.getType();
5625   if (getDerived().AlwaysRebuild() ||
5626       E.get() != TL.getUnderlyingExpr()) {
5627     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5628     if (Result.isNull())
5629       return QualType();
5630   }
5631   else E.get();
5632
5633   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5634   NewTL.setTypeofLoc(TL.getTypeofLoc());
5635   NewTL.setLParenLoc(TL.getLParenLoc());
5636   NewTL.setRParenLoc(TL.getRParenLoc());
5637
5638   return Result;
5639 }
5640
5641 template<typename Derived>
5642 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5643                                                      TypeOfTypeLoc TL) {
5644   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5645   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5646   if (!New_Under_TI)
5647     return QualType();
5648
5649   QualType Result = TL.getType();
5650   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5651     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5652     if (Result.isNull())
5653       return QualType();
5654   }
5655
5656   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5657   NewTL.setTypeofLoc(TL.getTypeofLoc());
5658   NewTL.setLParenLoc(TL.getLParenLoc());
5659   NewTL.setRParenLoc(TL.getRParenLoc());
5660   NewTL.setUnderlyingTInfo(New_Under_TI);
5661
5662   return Result;
5663 }
5664
5665 template<typename Derived>
5666 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5667                                                        DecltypeTypeLoc TL) {
5668   const DecltypeType *T = TL.getTypePtr();
5669
5670   // decltype expressions are not potentially evaluated contexts
5671   EnterExpressionEvaluationContext Unevaluated(
5672       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5673       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5674
5675   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5676   if (E.isInvalid())
5677     return QualType();
5678
5679   E = getSema().ActOnDecltypeExpression(E.get());
5680   if (E.isInvalid())
5681     return QualType();
5682
5683   QualType Result = TL.getType();
5684   if (getDerived().AlwaysRebuild() ||
5685       E.get() != T->getUnderlyingExpr()) {
5686     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5687     if (Result.isNull())
5688       return QualType();
5689   }
5690   else E.get();
5691
5692   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5693   NewTL.setNameLoc(TL.getNameLoc());
5694
5695   return Result;
5696 }
5697
5698 template<typename Derived>
5699 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5700                                                             TypeLocBuilder &TLB,
5701                                                      UnaryTransformTypeLoc TL) {
5702   QualType Result = TL.getType();
5703   if (Result->isDependentType()) {
5704     const UnaryTransformType *T = TL.getTypePtr();
5705     QualType NewBase =
5706       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5707     Result = getDerived().RebuildUnaryTransformType(NewBase,
5708                                                     T->getUTTKind(),
5709                                                     TL.getKWLoc());
5710     if (Result.isNull())
5711       return QualType();
5712   }
5713
5714   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5715   NewTL.setKWLoc(TL.getKWLoc());
5716   NewTL.setParensRange(TL.getParensRange());
5717   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5718   return Result;
5719 }
5720
5721 template<typename Derived>
5722 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5723                                                    AutoTypeLoc TL) {
5724   const AutoType *T = TL.getTypePtr();
5725   QualType OldDeduced = T->getDeducedType();
5726   QualType NewDeduced;
5727   if (!OldDeduced.isNull()) {
5728     NewDeduced = getDerived().TransformType(OldDeduced);
5729     if (NewDeduced.isNull())
5730       return QualType();
5731   }
5732
5733   QualType Result = TL.getType();
5734   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5735       T->isDependentType()) {
5736     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5737     if (Result.isNull())
5738       return QualType();
5739   }
5740
5741   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5742   NewTL.setNameLoc(TL.getNameLoc());
5743
5744   return Result;
5745 }
5746
5747 template<typename Derived>
5748 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5749     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5750   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5751
5752   CXXScopeSpec SS;
5753   TemplateName TemplateName = getDerived().TransformTemplateName(
5754       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5755   if (TemplateName.isNull())
5756     return QualType();
5757
5758   QualType OldDeduced = T->getDeducedType();
5759   QualType NewDeduced;
5760   if (!OldDeduced.isNull()) {
5761     NewDeduced = getDerived().TransformType(OldDeduced);
5762     if (NewDeduced.isNull())
5763       return QualType();
5764   }
5765
5766   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5767       TemplateName, NewDeduced);
5768   if (Result.isNull())
5769     return QualType();
5770
5771   DeducedTemplateSpecializationTypeLoc NewTL =
5772       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5773   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5774
5775   return Result;
5776 }
5777
5778 template<typename Derived>
5779 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5780                                                      RecordTypeLoc TL) {
5781   const RecordType *T = TL.getTypePtr();
5782   RecordDecl *Record
5783     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5784                                                           T->getDecl()));
5785   if (!Record)
5786     return QualType();
5787
5788   QualType Result = TL.getType();
5789   if (getDerived().AlwaysRebuild() ||
5790       Record != T->getDecl()) {
5791     Result = getDerived().RebuildRecordType(Record);
5792     if (Result.isNull())
5793       return QualType();
5794   }
5795
5796   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5797   NewTL.setNameLoc(TL.getNameLoc());
5798
5799   return Result;
5800 }
5801
5802 template<typename Derived>
5803 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5804                                                    EnumTypeLoc TL) {
5805   const EnumType *T = TL.getTypePtr();
5806   EnumDecl *Enum
5807     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5808                                                         T->getDecl()));
5809   if (!Enum)
5810     return QualType();
5811
5812   QualType Result = TL.getType();
5813   if (getDerived().AlwaysRebuild() ||
5814       Enum != T->getDecl()) {
5815     Result = getDerived().RebuildEnumType(Enum);
5816     if (Result.isNull())
5817       return QualType();
5818   }
5819
5820   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5821   NewTL.setNameLoc(TL.getNameLoc());
5822
5823   return Result;
5824 }
5825
5826 template<typename Derived>
5827 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5828                                          TypeLocBuilder &TLB,
5829                                          InjectedClassNameTypeLoc TL) {
5830   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5831                                        TL.getTypePtr()->getDecl());
5832   if (!D) return QualType();
5833
5834   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5835   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5836   return T;
5837 }
5838
5839 template<typename Derived>
5840 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5841                                                 TypeLocBuilder &TLB,
5842                                                 TemplateTypeParmTypeLoc TL) {
5843   return TransformTypeSpecType(TLB, TL);
5844 }
5845
5846 template<typename Derived>
5847 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5848                                          TypeLocBuilder &TLB,
5849                                          SubstTemplateTypeParmTypeLoc TL) {
5850   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5851
5852   // Substitute into the replacement type, which itself might involve something
5853   // that needs to be transformed. This only tends to occur with default
5854   // template arguments of template template parameters.
5855   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5856   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5857   if (Replacement.isNull())
5858     return QualType();
5859
5860   // Always canonicalize the replacement type.
5861   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5862   QualType Result
5863     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5864                                                    Replacement);
5865
5866   // Propagate type-source information.
5867   SubstTemplateTypeParmTypeLoc NewTL
5868     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5869   NewTL.setNameLoc(TL.getNameLoc());
5870   return Result;
5871
5872 }
5873
5874 template<typename Derived>
5875 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5876                                           TypeLocBuilder &TLB,
5877                                           SubstTemplateTypeParmPackTypeLoc TL) {
5878   return TransformTypeSpecType(TLB, TL);
5879 }
5880
5881 template<typename Derived>
5882 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5883                                                         TypeLocBuilder &TLB,
5884                                            TemplateSpecializationTypeLoc TL) {
5885   const TemplateSpecializationType *T = TL.getTypePtr();
5886
5887   // The nested-name-specifier never matters in a TemplateSpecializationType,
5888   // because we can't have a dependent nested-name-specifier anyway.
5889   CXXScopeSpec SS;
5890   TemplateName Template
5891     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5892                                          TL.getTemplateNameLoc());
5893   if (Template.isNull())
5894     return QualType();
5895
5896   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5897 }
5898
5899 template<typename Derived>
5900 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5901                                                      AtomicTypeLoc TL) {
5902   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5903   if (ValueType.isNull())
5904     return QualType();
5905
5906   QualType Result = TL.getType();
5907   if (getDerived().AlwaysRebuild() ||
5908       ValueType != TL.getValueLoc().getType()) {
5909     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5910     if (Result.isNull())
5911       return QualType();
5912   }
5913
5914   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5915   NewTL.setKWLoc(TL.getKWLoc());
5916   NewTL.setLParenLoc(TL.getLParenLoc());
5917   NewTL.setRParenLoc(TL.getRParenLoc());
5918
5919   return Result;
5920 }
5921
5922 template <typename Derived>
5923 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5924                                                    PipeTypeLoc TL) {
5925   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5926   if (ValueType.isNull())
5927     return QualType();
5928
5929   QualType Result = TL.getType();
5930   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5931     const PipeType *PT = Result->getAs<PipeType>();
5932     bool isReadPipe = PT->isReadOnly();
5933     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5934     if (Result.isNull())
5935       return QualType();
5936   }
5937
5938   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5939   NewTL.setKWLoc(TL.getKWLoc());
5940
5941   return Result;
5942 }
5943
5944   /// Simple iterator that traverses the template arguments in a
5945   /// container that provides a \c getArgLoc() member function.
5946   ///
5947   /// This iterator is intended to be used with the iterator form of
5948   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5949   template<typename ArgLocContainer>
5950   class TemplateArgumentLocContainerIterator {
5951     ArgLocContainer *Container;
5952     unsigned Index;
5953
5954   public:
5955     typedef TemplateArgumentLoc value_type;
5956     typedef TemplateArgumentLoc reference;
5957     typedef int difference_type;
5958     typedef std::input_iterator_tag iterator_category;
5959
5960     class pointer {
5961       TemplateArgumentLoc Arg;
5962
5963     public:
5964       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5965
5966       const TemplateArgumentLoc *operator->() const {
5967         return &Arg;
5968       }
5969     };
5970
5971
5972     TemplateArgumentLocContainerIterator() {}
5973
5974     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5975                                  unsigned Index)
5976       : Container(&Container), Index(Index) { }
5977
5978     TemplateArgumentLocContainerIterator &operator++() {
5979       ++Index;
5980       return *this;
5981     }
5982
5983     TemplateArgumentLocContainerIterator operator++(int) {
5984       TemplateArgumentLocContainerIterator Old(*this);
5985       ++(*this);
5986       return Old;
5987     }
5988
5989     TemplateArgumentLoc operator*() const {
5990       return Container->getArgLoc(Index);
5991     }
5992
5993     pointer operator->() const {
5994       return pointer(Container->getArgLoc(Index));
5995     }
5996
5997     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5998                            const TemplateArgumentLocContainerIterator &Y) {
5999       return X.Container == Y.Container && X.Index == Y.Index;
6000     }
6001
6002     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6003                            const TemplateArgumentLocContainerIterator &Y) {
6004       return !(X == Y);
6005     }
6006   };
6007
6008
6009 template <typename Derived>
6010 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6011                                                         TypeLocBuilder &TLB,
6012                                            TemplateSpecializationTypeLoc TL,
6013                                                       TemplateName Template) {
6014   TemplateArgumentListInfo NewTemplateArgs;
6015   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6016   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6017   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6018     ArgIterator;
6019   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6020                                               ArgIterator(TL, TL.getNumArgs()),
6021                                               NewTemplateArgs))
6022     return QualType();
6023
6024   // FIXME: maybe don't rebuild if all the template arguments are the same.
6025
6026   QualType Result =
6027     getDerived().RebuildTemplateSpecializationType(Template,
6028                                                    TL.getTemplateNameLoc(),
6029                                                    NewTemplateArgs);
6030
6031   if (!Result.isNull()) {
6032     // Specializations of template template parameters are represented as
6033     // TemplateSpecializationTypes, and substitution of type alias templates
6034     // within a dependent context can transform them into
6035     // DependentTemplateSpecializationTypes.
6036     if (isa<DependentTemplateSpecializationType>(Result)) {
6037       DependentTemplateSpecializationTypeLoc NewTL
6038         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6039       NewTL.setElaboratedKeywordLoc(SourceLocation());
6040       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6041       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6042       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6043       NewTL.setLAngleLoc(TL.getLAngleLoc());
6044       NewTL.setRAngleLoc(TL.getRAngleLoc());
6045       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6046         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6047       return Result;
6048     }
6049
6050     TemplateSpecializationTypeLoc NewTL
6051       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6052     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6053     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6054     NewTL.setLAngleLoc(TL.getLAngleLoc());
6055     NewTL.setRAngleLoc(TL.getRAngleLoc());
6056     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6057       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6058   }
6059
6060   return Result;
6061 }
6062
6063 template <typename Derived>
6064 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6065                                      TypeLocBuilder &TLB,
6066                                      DependentTemplateSpecializationTypeLoc TL,
6067                                      TemplateName Template,
6068                                      CXXScopeSpec &SS) {
6069   TemplateArgumentListInfo NewTemplateArgs;
6070   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6071   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6072   typedef TemplateArgumentLocContainerIterator<
6073             DependentTemplateSpecializationTypeLoc> ArgIterator;
6074   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6075                                               ArgIterator(TL, TL.getNumArgs()),
6076                                               NewTemplateArgs))
6077     return QualType();
6078
6079   // FIXME: maybe don't rebuild if all the template arguments are the same.
6080
6081   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6082     QualType Result
6083       = getSema().Context.getDependentTemplateSpecializationType(
6084                                                 TL.getTypePtr()->getKeyword(),
6085                                                          DTN->getQualifier(),
6086                                                          DTN->getIdentifier(),
6087                                                                NewTemplateArgs);
6088
6089     DependentTemplateSpecializationTypeLoc NewTL
6090       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6091     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6092     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6093     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6094     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6095     NewTL.setLAngleLoc(TL.getLAngleLoc());
6096     NewTL.setRAngleLoc(TL.getRAngleLoc());
6097     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6098       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6099     return Result;
6100   }
6101
6102   QualType Result
6103     = getDerived().RebuildTemplateSpecializationType(Template,
6104                                                      TL.getTemplateNameLoc(),
6105                                                      NewTemplateArgs);
6106
6107   if (!Result.isNull()) {
6108     /// FIXME: Wrap this in an elaborated-type-specifier?
6109     TemplateSpecializationTypeLoc NewTL
6110       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6111     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6112     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6113     NewTL.setLAngleLoc(TL.getLAngleLoc());
6114     NewTL.setRAngleLoc(TL.getRAngleLoc());
6115     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6116       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6117   }
6118
6119   return Result;
6120 }
6121
6122 template<typename Derived>
6123 QualType
6124 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6125                                                 ElaboratedTypeLoc TL) {
6126   const ElaboratedType *T = TL.getTypePtr();
6127
6128   NestedNameSpecifierLoc QualifierLoc;
6129   // NOTE: the qualifier in an ElaboratedType is optional.
6130   if (TL.getQualifierLoc()) {
6131     QualifierLoc
6132       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6133     if (!QualifierLoc)
6134       return QualType();
6135   }
6136
6137   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6138   if (NamedT.isNull())
6139     return QualType();
6140
6141   // C++0x [dcl.type.elab]p2:
6142   //   If the identifier resolves to a typedef-name or the simple-template-id
6143   //   resolves to an alias template specialization, the
6144   //   elaborated-type-specifier is ill-formed.
6145   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6146     if (const TemplateSpecializationType *TST =
6147           NamedT->getAs<TemplateSpecializationType>()) {
6148       TemplateName Template = TST->getTemplateName();
6149       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6150               Template.getAsTemplateDecl())) {
6151         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6152                      diag::err_tag_reference_non_tag)
6153             << TAT << Sema::NTK_TypeAliasTemplate
6154             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6155         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6156       }
6157     }
6158   }
6159
6160   QualType Result = TL.getType();
6161   if (getDerived().AlwaysRebuild() ||
6162       QualifierLoc != TL.getQualifierLoc() ||
6163       NamedT != T->getNamedType()) {
6164     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6165                                                 T->getKeyword(),
6166                                                 QualifierLoc, NamedT);
6167     if (Result.isNull())
6168       return QualType();
6169   }
6170
6171   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6172   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6173   NewTL.setQualifierLoc(QualifierLoc);
6174   return Result;
6175 }
6176
6177 template<typename Derived>
6178 QualType TreeTransform<Derived>::TransformAttributedType(
6179                                                 TypeLocBuilder &TLB,
6180                                                 AttributedTypeLoc TL) {
6181   const AttributedType *oldType = TL.getTypePtr();
6182   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6183   if (modifiedType.isNull())
6184     return QualType();
6185
6186   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6187   const Attr *oldAttr = TL.getAttr();
6188   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6189   if (oldAttr && !newAttr)
6190     return QualType();
6191
6192   QualType result = TL.getType();
6193
6194   // FIXME: dependent operand expressions?
6195   if (getDerived().AlwaysRebuild() ||
6196       modifiedType != oldType->getModifiedType()) {
6197     // TODO: this is really lame; we should really be rebuilding the
6198     // equivalent type from first principles.
6199     QualType equivalentType
6200       = getDerived().TransformType(oldType->getEquivalentType());
6201     if (equivalentType.isNull())
6202       return QualType();
6203
6204     // Check whether we can add nullability; it is only represented as
6205     // type sugar, and therefore cannot be diagnosed in any other way.
6206     if (auto nullability = oldType->getImmediateNullability()) {
6207       if (!modifiedType->canHaveNullability()) {
6208         SemaRef.Diag(TL.getAttr()->getLocation(),
6209                      diag::err_nullability_nonpointer)
6210             << DiagNullabilityKind(*nullability, false) << modifiedType;
6211         return QualType();
6212       }
6213     }
6214
6215     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6216                                                modifiedType,
6217                                                equivalentType);
6218   }
6219
6220   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6221   newTL.setAttr(newAttr);
6222   return result;
6223 }
6224
6225 template<typename Derived>
6226 QualType
6227 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6228                                            ParenTypeLoc TL) {
6229   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6230   if (Inner.isNull())
6231     return QualType();
6232
6233   QualType Result = TL.getType();
6234   if (getDerived().AlwaysRebuild() ||
6235       Inner != TL.getInnerLoc().getType()) {
6236     Result = getDerived().RebuildParenType(Inner);
6237     if (Result.isNull())
6238       return QualType();
6239   }
6240
6241   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6242   NewTL.setLParenLoc(TL.getLParenLoc());
6243   NewTL.setRParenLoc(TL.getRParenLoc());
6244   return Result;
6245 }
6246
6247 template <typename Derived>
6248 QualType
6249 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6250                                                     MacroQualifiedTypeLoc TL) {
6251   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6252   if (Inner.isNull())
6253     return QualType();
6254
6255   QualType Result = TL.getType();
6256   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6257     Result =
6258         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6259     if (Result.isNull())
6260       return QualType();
6261   }
6262
6263   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6264   NewTL.setExpansionLoc(TL.getExpansionLoc());
6265   return Result;
6266 }
6267
6268 template<typename Derived>
6269 QualType TreeTransform<Derived>::TransformDependentNameType(
6270     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6271   return TransformDependentNameType(TLB, TL, false);
6272 }
6273
6274 template<typename Derived>
6275 QualType TreeTransform<Derived>::TransformDependentNameType(
6276     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6277   const DependentNameType *T = TL.getTypePtr();
6278
6279   NestedNameSpecifierLoc QualifierLoc
6280     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6281   if (!QualifierLoc)
6282     return QualType();
6283
6284   QualType Result
6285     = getDerived().RebuildDependentNameType(T->getKeyword(),
6286                                             TL.getElaboratedKeywordLoc(),
6287                                             QualifierLoc,
6288                                             T->getIdentifier(),
6289                                             TL.getNameLoc(),
6290                                             DeducedTSTContext);
6291   if (Result.isNull())
6292     return QualType();
6293
6294   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6295     QualType NamedT = ElabT->getNamedType();
6296     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6297
6298     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6299     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6300     NewTL.setQualifierLoc(QualifierLoc);
6301   } else {
6302     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6303     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6304     NewTL.setQualifierLoc(QualifierLoc);
6305     NewTL.setNameLoc(TL.getNameLoc());
6306   }
6307   return Result;
6308 }
6309
6310 template<typename Derived>
6311 QualType TreeTransform<Derived>::
6312           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6313                                  DependentTemplateSpecializationTypeLoc TL) {
6314   NestedNameSpecifierLoc QualifierLoc;
6315   if (TL.getQualifierLoc()) {
6316     QualifierLoc
6317       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6318     if (!QualifierLoc)
6319       return QualType();
6320   }
6321
6322   return getDerived()
6323            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6324 }
6325
6326 template<typename Derived>
6327 QualType TreeTransform<Derived>::
6328 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6329                                    DependentTemplateSpecializationTypeLoc TL,
6330                                        NestedNameSpecifierLoc QualifierLoc) {
6331   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6332
6333   TemplateArgumentListInfo NewTemplateArgs;
6334   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6335   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6336
6337   typedef TemplateArgumentLocContainerIterator<
6338   DependentTemplateSpecializationTypeLoc> ArgIterator;
6339   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6340                                               ArgIterator(TL, TL.getNumArgs()),
6341                                               NewTemplateArgs))
6342     return QualType();
6343
6344   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6345       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6346       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6347       /*AllowInjectedClassName*/ false);
6348   if (Result.isNull())
6349     return QualType();
6350
6351   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6352     QualType NamedT = ElabT->getNamedType();
6353
6354     // Copy information relevant to the template specialization.
6355     TemplateSpecializationTypeLoc NamedTL
6356       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6357     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6358     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6359     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6360     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6361     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6362       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6363
6364     // Copy information relevant to the elaborated type.
6365     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6366     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6367     NewTL.setQualifierLoc(QualifierLoc);
6368   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6369     DependentTemplateSpecializationTypeLoc SpecTL
6370       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6371     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6372     SpecTL.setQualifierLoc(QualifierLoc);
6373     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6374     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6375     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6376     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6377     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6378       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6379   } else {
6380     TemplateSpecializationTypeLoc SpecTL
6381       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6382     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6383     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6384     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6385     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6386     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6387       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6388   }
6389   return Result;
6390 }
6391
6392 template<typename Derived>
6393 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6394                                                       PackExpansionTypeLoc TL) {
6395   QualType Pattern
6396     = getDerived().TransformType(TLB, TL.getPatternLoc());
6397   if (Pattern.isNull())
6398     return QualType();
6399
6400   QualType Result = TL.getType();
6401   if (getDerived().AlwaysRebuild() ||
6402       Pattern != TL.getPatternLoc().getType()) {
6403     Result = getDerived().RebuildPackExpansionType(Pattern,
6404                                            TL.getPatternLoc().getSourceRange(),
6405                                                    TL.getEllipsisLoc(),
6406                                            TL.getTypePtr()->getNumExpansions());
6407     if (Result.isNull())
6408       return QualType();
6409   }
6410
6411   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6412   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6413   return Result;
6414 }
6415
6416 template<typename Derived>
6417 QualType
6418 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6419                                                    ObjCInterfaceTypeLoc TL) {
6420   // ObjCInterfaceType is never dependent.
6421   TLB.pushFullCopy(TL);
6422   return TL.getType();
6423 }
6424
6425 template<typename Derived>
6426 QualType
6427 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6428                                                    ObjCTypeParamTypeLoc TL) {
6429   const ObjCTypeParamType *T = TL.getTypePtr();
6430   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6431       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6432   if (!OTP)
6433     return QualType();
6434
6435   QualType Result = TL.getType();
6436   if (getDerived().AlwaysRebuild() ||
6437       OTP != T->getDecl()) {
6438     Result = getDerived().RebuildObjCTypeParamType(OTP,
6439                  TL.getProtocolLAngleLoc(),
6440                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6441                                     TL.getNumProtocols()),
6442                  TL.getProtocolLocs(),
6443                  TL.getProtocolRAngleLoc());
6444     if (Result.isNull())
6445       return QualType();
6446   }
6447
6448   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6449   if (TL.getNumProtocols()) {
6450     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6451     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6452       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6453     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6454   }
6455   return Result;
6456 }
6457
6458 template<typename Derived>
6459 QualType
6460 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6461                                                 ObjCObjectTypeLoc TL) {
6462   // Transform base type.
6463   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6464   if (BaseType.isNull())
6465     return QualType();
6466
6467   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6468
6469   // Transform type arguments.
6470   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6471   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6472     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6473     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6474     QualType TypeArg = TypeArgInfo->getType();
6475     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6476       AnyChanged = true;
6477
6478       // We have a pack expansion. Instantiate it.
6479       const auto *PackExpansion = PackExpansionLoc.getType()
6480                                     ->castAs<PackExpansionType>();
6481       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6482       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6483                                               Unexpanded);
6484       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6485
6486       // Determine whether the set of unexpanded parameter packs can
6487       // and should be expanded.
6488       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6489       bool Expand = false;
6490       bool RetainExpansion = false;
6491       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6492       if (getDerived().TryExpandParameterPacks(
6493             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6494             Unexpanded, Expand, RetainExpansion, NumExpansions))
6495         return QualType();
6496
6497       if (!Expand) {
6498         // We can't expand this pack expansion into separate arguments yet;
6499         // just substitute into the pattern and create a new pack expansion
6500         // type.
6501         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6502
6503         TypeLocBuilder TypeArgBuilder;
6504         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6505         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6506                                                              PatternLoc);
6507         if (NewPatternType.isNull())
6508           return QualType();
6509
6510         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6511                                       NewPatternType, NumExpansions);
6512         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6513         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6514         NewTypeArgInfos.push_back(
6515           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6516         continue;
6517       }
6518
6519       // Substitute into the pack expansion pattern for each slice of the
6520       // pack.
6521       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6522         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6523
6524         TypeLocBuilder TypeArgBuilder;
6525         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6526
6527         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6528                                                          PatternLoc);
6529         if (NewTypeArg.isNull())
6530           return QualType();
6531
6532         NewTypeArgInfos.push_back(
6533           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6534       }
6535
6536       continue;
6537     }
6538
6539     TypeLocBuilder TypeArgBuilder;
6540     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6541     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6542     if (NewTypeArg.isNull())
6543       return QualType();
6544
6545     // If nothing changed, just keep the old TypeSourceInfo.
6546     if (NewTypeArg == TypeArg) {
6547       NewTypeArgInfos.push_back(TypeArgInfo);
6548       continue;
6549     }
6550
6551     NewTypeArgInfos.push_back(
6552       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6553     AnyChanged = true;
6554   }
6555
6556   QualType Result = TL.getType();
6557   if (getDerived().AlwaysRebuild() || AnyChanged) {
6558     // Rebuild the type.
6559     Result = getDerived().RebuildObjCObjectType(
6560         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6561         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6562         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6563         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6564
6565     if (Result.isNull())
6566       return QualType();
6567   }
6568
6569   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6570   NewT.setHasBaseTypeAsWritten(true);
6571   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6572   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6573     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6574   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6575   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6576   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6577     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6578   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6579   return Result;
6580 }
6581
6582 template<typename Derived>
6583 QualType
6584 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6585                                                ObjCObjectPointerTypeLoc TL) {
6586   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6587   if (PointeeType.isNull())
6588     return QualType();
6589
6590   QualType Result = TL.getType();
6591   if (getDerived().AlwaysRebuild() ||
6592       PointeeType != TL.getPointeeLoc().getType()) {
6593     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6594                                                        TL.getStarLoc());
6595     if (Result.isNull())
6596       return QualType();
6597   }
6598
6599   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6600   NewT.setStarLoc(TL.getStarLoc());
6601   return Result;
6602 }
6603
6604 //===----------------------------------------------------------------------===//
6605 // Statement transformation
6606 //===----------------------------------------------------------------------===//
6607 template<typename Derived>
6608 StmtResult
6609 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6610   return S;
6611 }
6612
6613 template<typename Derived>
6614 StmtResult
6615 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6616   return getDerived().TransformCompoundStmt(S, false);
6617 }
6618
6619 template<typename Derived>
6620 StmtResult
6621 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6622                                               bool IsStmtExpr) {
6623   Sema::CompoundScopeRAII CompoundScope(getSema());
6624
6625   const Stmt *ExprResult = S->getStmtExprResult();
6626   bool SubStmtInvalid = false;
6627   bool SubStmtChanged = false;
6628   SmallVector<Stmt*, 8> Statements;
6629   for (auto *B : S->body()) {
6630     StmtResult Result = getDerived().TransformStmt(
6631         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
6632
6633     if (Result.isInvalid()) {
6634       // Immediately fail if this was a DeclStmt, since it's very
6635       // likely that this will cause problems for future statements.
6636       if (isa<DeclStmt>(B))
6637         return StmtError();
6638
6639       // Otherwise, just keep processing substatements and fail later.
6640       SubStmtInvalid = true;
6641       continue;
6642     }
6643
6644     SubStmtChanged = SubStmtChanged || Result.get() != B;
6645     Statements.push_back(Result.getAs<Stmt>());
6646   }
6647
6648   if (SubStmtInvalid)
6649     return StmtError();
6650
6651   if (!getDerived().AlwaysRebuild() &&
6652       !SubStmtChanged)
6653     return S;
6654
6655   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6656                                           Statements,
6657                                           S->getRBracLoc(),
6658                                           IsStmtExpr);
6659 }
6660
6661 template<typename Derived>
6662 StmtResult
6663 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6664   ExprResult LHS, RHS;
6665   {
6666     EnterExpressionEvaluationContext Unevaluated(
6667         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6668
6669     // Transform the left-hand case value.
6670     LHS = getDerived().TransformExpr(S->getLHS());
6671     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6672     if (LHS.isInvalid())
6673       return StmtError();
6674
6675     // Transform the right-hand case value (for the GNU case-range extension).
6676     RHS = getDerived().TransformExpr(S->getRHS());
6677     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6678     if (RHS.isInvalid())
6679       return StmtError();
6680   }
6681
6682   // Build the case statement.
6683   // Case statements are always rebuilt so that they will attached to their
6684   // transformed switch statement.
6685   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6686                                                        LHS.get(),
6687                                                        S->getEllipsisLoc(),
6688                                                        RHS.get(),
6689                                                        S->getColonLoc());
6690   if (Case.isInvalid())
6691     return StmtError();
6692
6693   // Transform the statement following the case
6694   StmtResult SubStmt =
6695       getDerived().TransformStmt(S->getSubStmt());
6696   if (SubStmt.isInvalid())
6697     return StmtError();
6698
6699   // Attach the body to the case statement
6700   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6701 }
6702
6703 template <typename Derived>
6704 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6705   // Transform the statement following the default case
6706   StmtResult SubStmt =
6707       getDerived().TransformStmt(S->getSubStmt());
6708   if (SubStmt.isInvalid())
6709     return StmtError();
6710
6711   // Default statements are always rebuilt
6712   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6713                                          SubStmt.get());
6714 }
6715
6716 template<typename Derived>
6717 StmtResult
6718 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6719   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6720   if (SubStmt.isInvalid())
6721     return StmtError();
6722
6723   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6724                                         S->getDecl());
6725   if (!LD)
6726     return StmtError();
6727
6728   // If we're transforming "in-place" (we're not creating new local
6729   // declarations), assume we're replacing the old label statement
6730   // and clear out the reference to it.
6731   if (LD == S->getDecl())
6732     S->getDecl()->setStmt(nullptr);
6733
6734   // FIXME: Pass the real colon location in.
6735   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6736                                        cast<LabelDecl>(LD), SourceLocation(),
6737                                        SubStmt.get());
6738 }
6739
6740 template <typename Derived>
6741 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6742   if (!R)
6743     return R;
6744
6745   switch (R->getKind()) {
6746 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6747 #define ATTR(X)
6748 #define PRAGMA_SPELLING_ATTR(X)                                                \
6749   case attr::X:                                                                \
6750     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6751 #include "clang/Basic/AttrList.inc"
6752   default:
6753     return R;
6754   }
6755 }
6756
6757 template <typename Derived>
6758 StmtResult
6759 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6760                                                 StmtDiscardKind SDK) {
6761   bool AttrsChanged = false;
6762   SmallVector<const Attr *, 1> Attrs;
6763
6764   // Visit attributes and keep track if any are transformed.
6765   for (const auto *I : S->getAttrs()) {
6766     const Attr *R = getDerived().TransformAttr(I);
6767     AttrsChanged |= (I != R);
6768     Attrs.push_back(R);
6769   }
6770
6771   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6772   if (SubStmt.isInvalid())
6773     return StmtError();
6774
6775   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6776     return S;
6777
6778   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6779                                             SubStmt.get());
6780 }
6781
6782 template<typename Derived>
6783 StmtResult
6784 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6785   // Transform the initialization statement
6786   StmtResult Init = getDerived().TransformStmt(S->getInit());
6787   if (Init.isInvalid())
6788     return StmtError();
6789
6790   // Transform the condition
6791   Sema::ConditionResult Cond = getDerived().TransformCondition(
6792       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6793       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6794                        : Sema::ConditionKind::Boolean);
6795   if (Cond.isInvalid())
6796     return StmtError();
6797
6798   // If this is a constexpr if, determine which arm we should instantiate.
6799   llvm::Optional<bool> ConstexprConditionValue;
6800   if (S->isConstexpr())
6801     ConstexprConditionValue = Cond.getKnownValue();
6802
6803   // Transform the "then" branch.
6804   StmtResult Then;
6805   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6806     Then = getDerived().TransformStmt(S->getThen());
6807     if (Then.isInvalid())
6808       return StmtError();
6809   } else {
6810     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6811   }
6812
6813   // Transform the "else" branch.
6814   StmtResult Else;
6815   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6816     Else = getDerived().TransformStmt(S->getElse());
6817     if (Else.isInvalid())
6818       return StmtError();
6819   }
6820
6821   if (!getDerived().AlwaysRebuild() &&
6822       Init.get() == S->getInit() &&
6823       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6824       Then.get() == S->getThen() &&
6825       Else.get() == S->getElse())
6826     return S;
6827
6828   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6829                                     Init.get(), Then.get(), S->getElseLoc(),
6830                                     Else.get());
6831 }
6832
6833 template<typename Derived>
6834 StmtResult
6835 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6836   // Transform the initialization statement
6837   StmtResult Init = getDerived().TransformStmt(S->getInit());
6838   if (Init.isInvalid())
6839     return StmtError();
6840
6841   // Transform the condition.
6842   Sema::ConditionResult Cond = getDerived().TransformCondition(
6843       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6844       Sema::ConditionKind::Switch);
6845   if (Cond.isInvalid())
6846     return StmtError();
6847
6848   // Rebuild the switch statement.
6849   StmtResult Switch
6850     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
6851   if (Switch.isInvalid())
6852     return StmtError();
6853
6854   // Transform the body of the switch statement.
6855   StmtResult Body = getDerived().TransformStmt(S->getBody());
6856   if (Body.isInvalid())
6857     return StmtError();
6858
6859   // Complete the switch statement.
6860   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6861                                             Body.get());
6862 }
6863
6864 template<typename Derived>
6865 StmtResult
6866 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6867   // Transform the condition
6868   Sema::ConditionResult Cond = getDerived().TransformCondition(
6869       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6870       Sema::ConditionKind::Boolean);
6871   if (Cond.isInvalid())
6872     return StmtError();
6873
6874   // Transform the body
6875   StmtResult Body = getDerived().TransformStmt(S->getBody());
6876   if (Body.isInvalid())
6877     return StmtError();
6878
6879   if (!getDerived().AlwaysRebuild() &&
6880       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6881       Body.get() == S->getBody())
6882     return Owned(S);
6883
6884   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6885 }
6886
6887 template<typename Derived>
6888 StmtResult
6889 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6890   // Transform the body
6891   StmtResult Body = getDerived().TransformStmt(S->getBody());
6892   if (Body.isInvalid())
6893     return StmtError();
6894
6895   // Transform the condition
6896   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6897   if (Cond.isInvalid())
6898     return StmtError();
6899
6900   if (!getDerived().AlwaysRebuild() &&
6901       Cond.get() == S->getCond() &&
6902       Body.get() == S->getBody())
6903     return S;
6904
6905   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6906                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6907                                     S->getRParenLoc());
6908 }
6909
6910 template<typename Derived>
6911 StmtResult
6912 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6913   if (getSema().getLangOpts().OpenMP)
6914     getSema().startOpenMPLoop();
6915
6916   // Transform the initialization statement
6917   StmtResult Init = getDerived().TransformStmt(S->getInit());
6918   if (Init.isInvalid())
6919     return StmtError();
6920
6921   // In OpenMP loop region loop control variable must be captured and be
6922   // private. Perform analysis of first part (if any).
6923   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6924     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6925
6926   // Transform the condition
6927   Sema::ConditionResult Cond = getDerived().TransformCondition(
6928       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6929       Sema::ConditionKind::Boolean);
6930   if (Cond.isInvalid())
6931     return StmtError();
6932
6933   // Transform the increment
6934   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6935   if (Inc.isInvalid())
6936     return StmtError();
6937
6938   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6939   if (S->getInc() && !FullInc.get())
6940     return StmtError();
6941
6942   // Transform the body
6943   StmtResult Body = getDerived().TransformStmt(S->getBody());
6944   if (Body.isInvalid())
6945     return StmtError();
6946
6947   if (!getDerived().AlwaysRebuild() &&
6948       Init.get() == S->getInit() &&
6949       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6950       Inc.get() == S->getInc() &&
6951       Body.get() == S->getBody())
6952     return S;
6953
6954   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6955                                      Init.get(), Cond, FullInc,
6956                                      S->getRParenLoc(), Body.get());
6957 }
6958
6959 template<typename Derived>
6960 StmtResult
6961 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6962   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6963                                         S->getLabel());
6964   if (!LD)
6965     return StmtError();
6966
6967   // Goto statements must always be rebuilt, to resolve the label.
6968   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6969                                       cast<LabelDecl>(LD));
6970 }
6971
6972 template<typename Derived>
6973 StmtResult
6974 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6975   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6976   if (Target.isInvalid())
6977     return StmtError();
6978   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6979
6980   if (!getDerived().AlwaysRebuild() &&
6981       Target.get() == S->getTarget())
6982     return S;
6983
6984   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6985                                               Target.get());
6986 }
6987
6988 template<typename Derived>
6989 StmtResult
6990 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6991   return S;
6992 }
6993
6994 template<typename Derived>
6995 StmtResult
6996 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6997   return S;
6998 }
6999
7000 template<typename Derived>
7001 StmtResult
7002 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7003   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7004                                                         /*NotCopyInit*/false);
7005   if (Result.isInvalid())
7006     return StmtError();
7007
7008   // FIXME: We always rebuild the return statement because there is no way
7009   // to tell whether the return type of the function has changed.
7010   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7011 }
7012
7013 template<typename Derived>
7014 StmtResult
7015 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7016   bool DeclChanged = false;
7017   SmallVector<Decl *, 4> Decls;
7018   for (auto *D : S->decls()) {
7019     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7020     if (!Transformed)
7021       return StmtError();
7022
7023     if (Transformed != D)
7024       DeclChanged = true;
7025
7026     Decls.push_back(Transformed);
7027   }
7028
7029   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7030     return S;
7031
7032   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7033 }
7034
7035 template<typename Derived>
7036 StmtResult
7037 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7038
7039   SmallVector<Expr*, 8> Constraints;
7040   SmallVector<Expr*, 8> Exprs;
7041   SmallVector<IdentifierInfo *, 4> Names;
7042
7043   ExprResult AsmString;
7044   SmallVector<Expr*, 8> Clobbers;
7045
7046   bool ExprsChanged = false;
7047
7048   // Go through the outputs.
7049   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7050     Names.push_back(S->getOutputIdentifier(I));
7051
7052     // No need to transform the constraint literal.
7053     Constraints.push_back(S->getOutputConstraintLiteral(I));
7054
7055     // Transform the output expr.
7056     Expr *OutputExpr = S->getOutputExpr(I);
7057     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7058     if (Result.isInvalid())
7059       return StmtError();
7060
7061     ExprsChanged |= Result.get() != OutputExpr;
7062
7063     Exprs.push_back(Result.get());
7064   }
7065
7066   // Go through the inputs.
7067   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7068     Names.push_back(S->getInputIdentifier(I));
7069
7070     // No need to transform the constraint literal.
7071     Constraints.push_back(S->getInputConstraintLiteral(I));
7072
7073     // Transform the input expr.
7074     Expr *InputExpr = S->getInputExpr(I);
7075     ExprResult Result = getDerived().TransformExpr(InputExpr);
7076     if (Result.isInvalid())
7077       return StmtError();
7078
7079     ExprsChanged |= Result.get() != InputExpr;
7080
7081     Exprs.push_back(Result.get());
7082   }
7083
7084   // Go through the Labels.
7085   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7086     Names.push_back(S->getLabelIdentifier(I));
7087
7088     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7089     if (Result.isInvalid())
7090       return StmtError();
7091     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7092     Exprs.push_back(Result.get());
7093   }
7094   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7095     return S;
7096
7097   // Go through the clobbers.
7098   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7099     Clobbers.push_back(S->getClobberStringLiteral(I));
7100
7101   // No need to transform the asm string literal.
7102   AsmString = S->getAsmString();
7103   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7104                                         S->isVolatile(), S->getNumOutputs(),
7105                                         S->getNumInputs(), Names.data(),
7106                                         Constraints, Exprs, AsmString.get(),
7107                                         Clobbers, S->getNumLabels(),
7108                                         S->getRParenLoc());
7109 }
7110
7111 template<typename Derived>
7112 StmtResult
7113 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7114   ArrayRef<Token> AsmToks =
7115     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7116
7117   bool HadError = false, HadChange = false;
7118
7119   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7120   SmallVector<Expr*, 8> TransformedExprs;
7121   TransformedExprs.reserve(SrcExprs.size());
7122   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7123     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7124     if (!Result.isUsable()) {
7125       HadError = true;
7126     } else {
7127       HadChange |= (Result.get() != SrcExprs[i]);
7128       TransformedExprs.push_back(Result.get());
7129     }
7130   }
7131
7132   if (HadError) return StmtError();
7133   if (!HadChange && !getDerived().AlwaysRebuild())
7134     return Owned(S);
7135
7136   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7137                                        AsmToks, S->getAsmString(),
7138                                        S->getNumOutputs(), S->getNumInputs(),
7139                                        S->getAllConstraints(), S->getClobbers(),
7140                                        TransformedExprs, S->getEndLoc());
7141 }
7142
7143 // C++ Coroutines TS
7144
7145 template<typename Derived>
7146 StmtResult
7147 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7148   auto *ScopeInfo = SemaRef.getCurFunction();
7149   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7150   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7151          ScopeInfo->NeedsCoroutineSuspends &&
7152          ScopeInfo->CoroutineSuspends.first == nullptr &&
7153          ScopeInfo->CoroutineSuspends.second == nullptr &&
7154          "expected clean scope info");
7155
7156   // Set that we have (possibly-invalid) suspend points before we do anything
7157   // that may fail.
7158   ScopeInfo->setNeedsCoroutineSuspends(false);
7159
7160   // The new CoroutinePromise object needs to be built and put into the current
7161   // FunctionScopeInfo before any transformations or rebuilding occurs.
7162   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7163     return StmtError();
7164   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7165   if (!Promise)
7166     return StmtError();
7167   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7168   ScopeInfo->CoroutinePromise = Promise;
7169
7170   // Transform the implicit coroutine statements we built during the initial
7171   // parse.
7172   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7173   if (InitSuspend.isInvalid())
7174     return StmtError();
7175   StmtResult FinalSuspend =
7176       getDerived().TransformStmt(S->getFinalSuspendStmt());
7177   if (FinalSuspend.isInvalid())
7178     return StmtError();
7179   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7180   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7181
7182   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7183   if (BodyRes.isInvalid())
7184     return StmtError();
7185
7186   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7187   if (Builder.isInvalid())
7188     return StmtError();
7189
7190   Expr *ReturnObject = S->getReturnValueInit();
7191   assert(ReturnObject && "the return object is expected to be valid");
7192   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7193                                                      /*NoCopyInit*/ false);
7194   if (Res.isInvalid())
7195     return StmtError();
7196   Builder.ReturnValue = Res.get();
7197
7198   if (S->hasDependentPromiseType()) {
7199     // PR41909: We may find a generic coroutine lambda definition within a
7200     // template function that is being instantiated. In this case, the lambda
7201     // will have a dependent promise type, until it is used in an expression
7202     // that creates an instantiation with a non-dependent promise type. We
7203     // should not assert or build coroutine dependent statements for such a
7204     // generic lambda.
7205     auto *MD = dyn_cast_or_null<CXXMethodDecl>(FD);
7206     if (!MD || !MD->getParent()->isGenericLambda()) {
7207       assert(!Promise->getType()->isDependentType() &&
7208              "the promise type must no longer be dependent");
7209       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7210              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7211              "these nodes should not have been built yet");
7212       if (!Builder.buildDependentStatements())
7213         return StmtError();
7214     }
7215   } else {
7216     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7217       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7218       if (Res.isInvalid())
7219         return StmtError();
7220       Builder.OnFallthrough = Res.get();
7221     }
7222
7223     if (auto *OnException = S->getExceptionHandler()) {
7224       StmtResult Res = getDerived().TransformStmt(OnException);
7225       if (Res.isInvalid())
7226         return StmtError();
7227       Builder.OnException = Res.get();
7228     }
7229
7230     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7231       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7232       if (Res.isInvalid())
7233         return StmtError();
7234       Builder.ReturnStmtOnAllocFailure = Res.get();
7235     }
7236
7237     // Transform any additional statements we may have already built
7238     assert(S->getAllocate() && S->getDeallocate() &&
7239            "allocation and deallocation calls must already be built");
7240     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7241     if (AllocRes.isInvalid())
7242       return StmtError();
7243     Builder.Allocate = AllocRes.get();
7244
7245     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7246     if (DeallocRes.isInvalid())
7247       return StmtError();
7248     Builder.Deallocate = DeallocRes.get();
7249
7250     assert(S->getResultDecl() && "ResultDecl must already be built");
7251     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7252     if (ResultDecl.isInvalid())
7253       return StmtError();
7254     Builder.ResultDecl = ResultDecl.get();
7255
7256     if (auto *ReturnStmt = S->getReturnStmt()) {
7257       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7258       if (Res.isInvalid())
7259         return StmtError();
7260       Builder.ReturnStmt = Res.get();
7261     }
7262   }
7263
7264   return getDerived().RebuildCoroutineBodyStmt(Builder);
7265 }
7266
7267 template<typename Derived>
7268 StmtResult
7269 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7270   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7271                                                         /*NotCopyInit*/false);
7272   if (Result.isInvalid())
7273     return StmtError();
7274
7275   // Always rebuild; we don't know if this needs to be injected into a new
7276   // context or if the promise type has changed.
7277   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7278                                           S->isImplicit());
7279 }
7280
7281 template<typename Derived>
7282 ExprResult
7283 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7284   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7285                                                         /*NotCopyInit*/false);
7286   if (Result.isInvalid())
7287     return ExprError();
7288
7289   // Always rebuild; we don't know if this needs to be injected into a new
7290   // context or if the promise type has changed.
7291   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7292                                          E->isImplicit());
7293 }
7294
7295 template <typename Derived>
7296 ExprResult
7297 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7298   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7299                                                         /*NotCopyInit*/ false);
7300   if (OperandResult.isInvalid())
7301     return ExprError();
7302
7303   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7304           E->getOperatorCoawaitLookup());
7305
7306   if (LookupResult.isInvalid())
7307     return ExprError();
7308
7309   // Always rebuild; we don't know if this needs to be injected into a new
7310   // context or if the promise type has changed.
7311   return getDerived().RebuildDependentCoawaitExpr(
7312       E->getKeywordLoc(), OperandResult.get(),
7313       cast<UnresolvedLookupExpr>(LookupResult.get()));
7314 }
7315
7316 template<typename Derived>
7317 ExprResult
7318 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7319   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7320                                                         /*NotCopyInit*/false);
7321   if (Result.isInvalid())
7322     return ExprError();
7323
7324   // Always rebuild; we don't know if this needs to be injected into a new
7325   // context or if the promise type has changed.
7326   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7327 }
7328
7329 // Objective-C Statements.
7330
7331 template<typename Derived>
7332 StmtResult
7333 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7334   // Transform the body of the @try.
7335   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7336   if (TryBody.isInvalid())
7337     return StmtError();
7338
7339   // Transform the @catch statements (if present).
7340   bool AnyCatchChanged = false;
7341   SmallVector<Stmt*, 8> CatchStmts;
7342   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7343     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7344     if (Catch.isInvalid())
7345       return StmtError();
7346     if (Catch.get() != S->getCatchStmt(I))
7347       AnyCatchChanged = true;
7348     CatchStmts.push_back(Catch.get());
7349   }
7350
7351   // Transform the @finally statement (if present).
7352   StmtResult Finally;
7353   if (S->getFinallyStmt()) {
7354     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7355     if (Finally.isInvalid())
7356       return StmtError();
7357   }
7358
7359   // If nothing changed, just retain this statement.
7360   if (!getDerived().AlwaysRebuild() &&
7361       TryBody.get() == S->getTryBody() &&
7362       !AnyCatchChanged &&
7363       Finally.get() == S->getFinallyStmt())
7364     return S;
7365
7366   // Build a new statement.
7367   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7368                                            CatchStmts, Finally.get());
7369 }
7370
7371 template<typename Derived>
7372 StmtResult
7373 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7374   // Transform the @catch parameter, if there is one.
7375   VarDecl *Var = nullptr;
7376   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7377     TypeSourceInfo *TSInfo = nullptr;
7378     if (FromVar->getTypeSourceInfo()) {
7379       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7380       if (!TSInfo)
7381         return StmtError();
7382     }
7383
7384     QualType T;
7385     if (TSInfo)
7386       T = TSInfo->getType();
7387     else {
7388       T = getDerived().TransformType(FromVar->getType());
7389       if (T.isNull())
7390         return StmtError();
7391     }
7392
7393     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7394     if (!Var)
7395       return StmtError();
7396   }
7397
7398   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7399   if (Body.isInvalid())
7400     return StmtError();
7401
7402   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7403                                              S->getRParenLoc(),
7404                                              Var, Body.get());
7405 }
7406
7407 template<typename Derived>
7408 StmtResult
7409 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7410   // Transform the body.
7411   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7412   if (Body.isInvalid())
7413     return StmtError();
7414
7415   // If nothing changed, just retain this statement.
7416   if (!getDerived().AlwaysRebuild() &&
7417       Body.get() == S->getFinallyBody())
7418     return S;
7419
7420   // Build a new statement.
7421   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7422                                                Body.get());
7423 }
7424
7425 template<typename Derived>
7426 StmtResult
7427 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7428   ExprResult Operand;
7429   if (S->getThrowExpr()) {
7430     Operand = getDerived().TransformExpr(S->getThrowExpr());
7431     if (Operand.isInvalid())
7432       return StmtError();
7433   }
7434
7435   if (!getDerived().AlwaysRebuild() &&
7436       Operand.get() == S->getThrowExpr())
7437     return S;
7438
7439   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7440 }
7441
7442 template<typename Derived>
7443 StmtResult
7444 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7445                                                   ObjCAtSynchronizedStmt *S) {
7446   // Transform the object we are locking.
7447   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7448   if (Object.isInvalid())
7449     return StmtError();
7450   Object =
7451     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7452                                                   Object.get());
7453   if (Object.isInvalid())
7454     return StmtError();
7455
7456   // Transform the body.
7457   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7458   if (Body.isInvalid())
7459     return StmtError();
7460
7461   // If nothing change, just retain the current statement.
7462   if (!getDerived().AlwaysRebuild() &&
7463       Object.get() == S->getSynchExpr() &&
7464       Body.get() == S->getSynchBody())
7465     return S;
7466
7467   // Build a new statement.
7468   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7469                                                     Object.get(), Body.get());
7470 }
7471
7472 template<typename Derived>
7473 StmtResult
7474 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7475                                               ObjCAutoreleasePoolStmt *S) {
7476   // Transform the body.
7477   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7478   if (Body.isInvalid())
7479     return StmtError();
7480
7481   // If nothing changed, just retain this statement.
7482   if (!getDerived().AlwaysRebuild() &&
7483       Body.get() == S->getSubStmt())
7484     return S;
7485
7486   // Build a new statement.
7487   return getDerived().RebuildObjCAutoreleasePoolStmt(
7488                         S->getAtLoc(), Body.get());
7489 }
7490
7491 template<typename Derived>
7492 StmtResult
7493 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7494                                                   ObjCForCollectionStmt *S) {
7495   // Transform the element statement.
7496   StmtResult Element =
7497       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7498   if (Element.isInvalid())
7499     return StmtError();
7500
7501   // Transform the collection expression.
7502   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7503   if (Collection.isInvalid())
7504     return StmtError();
7505
7506   // Transform the body.
7507   StmtResult Body = getDerived().TransformStmt(S->getBody());
7508   if (Body.isInvalid())
7509     return StmtError();
7510
7511   // If nothing changed, just retain this statement.
7512   if (!getDerived().AlwaysRebuild() &&
7513       Element.get() == S->getElement() &&
7514       Collection.get() == S->getCollection() &&
7515       Body.get() == S->getBody())
7516     return S;
7517
7518   // Build a new statement.
7519   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7520                                                    Element.get(),
7521                                                    Collection.get(),
7522                                                    S->getRParenLoc(),
7523                                                    Body.get());
7524 }
7525
7526 template <typename Derived>
7527 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7528   // Transform the exception declaration, if any.
7529   VarDecl *Var = nullptr;
7530   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7531     TypeSourceInfo *T =
7532         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7533     if (!T)
7534       return StmtError();
7535
7536     Var = getDerived().RebuildExceptionDecl(
7537         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7538         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7539     if (!Var || Var->isInvalidDecl())
7540       return StmtError();
7541   }
7542
7543   // Transform the actual exception handler.
7544   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7545   if (Handler.isInvalid())
7546     return StmtError();
7547
7548   if (!getDerived().AlwaysRebuild() && !Var &&
7549       Handler.get() == S->getHandlerBlock())
7550     return S;
7551
7552   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7553 }
7554
7555 template <typename Derived>
7556 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7557   // Transform the try block itself.
7558   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7559   if (TryBlock.isInvalid())
7560     return StmtError();
7561
7562   // Transform the handlers.
7563   bool HandlerChanged = false;
7564   SmallVector<Stmt *, 8> Handlers;
7565   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7566     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7567     if (Handler.isInvalid())
7568       return StmtError();
7569
7570     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7571     Handlers.push_back(Handler.getAs<Stmt>());
7572   }
7573
7574   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7575       !HandlerChanged)
7576     return S;
7577
7578   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7579                                         Handlers);
7580 }
7581
7582 template<typename Derived>
7583 StmtResult
7584 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7585   StmtResult Init =
7586       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7587   if (Init.isInvalid())
7588     return StmtError();
7589
7590   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7591   if (Range.isInvalid())
7592     return StmtError();
7593
7594   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7595   if (Begin.isInvalid())
7596     return StmtError();
7597   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7598   if (End.isInvalid())
7599     return StmtError();
7600
7601   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7602   if (Cond.isInvalid())
7603     return StmtError();
7604   if (Cond.get())
7605     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7606   if (Cond.isInvalid())
7607     return StmtError();
7608   if (Cond.get())
7609     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7610
7611   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7612   if (Inc.isInvalid())
7613     return StmtError();
7614   if (Inc.get())
7615     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7616
7617   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7618   if (LoopVar.isInvalid())
7619     return StmtError();
7620
7621   StmtResult NewStmt = S;
7622   if (getDerived().AlwaysRebuild() ||
7623       Init.get() != S->getInit() ||
7624       Range.get() != S->getRangeStmt() ||
7625       Begin.get() != S->getBeginStmt() ||
7626       End.get() != S->getEndStmt() ||
7627       Cond.get() != S->getCond() ||
7628       Inc.get() != S->getInc() ||
7629       LoopVar.get() != S->getLoopVarStmt()) {
7630     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7631                                                   S->getCoawaitLoc(), Init.get(),
7632                                                   S->getColonLoc(), Range.get(),
7633                                                   Begin.get(), End.get(),
7634                                                   Cond.get(),
7635                                                   Inc.get(), LoopVar.get(),
7636                                                   S->getRParenLoc());
7637     if (NewStmt.isInvalid())
7638       return StmtError();
7639   }
7640
7641   StmtResult Body = getDerived().TransformStmt(S->getBody());
7642   if (Body.isInvalid())
7643     return StmtError();
7644
7645   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7646   // it now so we have a new statement to attach the body to.
7647   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7648     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7649                                                   S->getCoawaitLoc(), Init.get(),
7650                                                   S->getColonLoc(), Range.get(),
7651                                                   Begin.get(), End.get(),
7652                                                   Cond.get(),
7653                                                   Inc.get(), LoopVar.get(),
7654                                                   S->getRParenLoc());
7655     if (NewStmt.isInvalid())
7656       return StmtError();
7657   }
7658
7659   if (NewStmt.get() == S)
7660     return S;
7661
7662   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7663 }
7664
7665 template<typename Derived>
7666 StmtResult
7667 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7668                                                     MSDependentExistsStmt *S) {
7669   // Transform the nested-name-specifier, if any.
7670   NestedNameSpecifierLoc QualifierLoc;
7671   if (S->getQualifierLoc()) {
7672     QualifierLoc
7673       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7674     if (!QualifierLoc)
7675       return StmtError();
7676   }
7677
7678   // Transform the declaration name.
7679   DeclarationNameInfo NameInfo = S->getNameInfo();
7680   if (NameInfo.getName()) {
7681     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7682     if (!NameInfo.getName())
7683       return StmtError();
7684   }
7685
7686   // Check whether anything changed.
7687   if (!getDerived().AlwaysRebuild() &&
7688       QualifierLoc == S->getQualifierLoc() &&
7689       NameInfo.getName() == S->getNameInfo().getName())
7690     return S;
7691
7692   // Determine whether this name exists, if we can.
7693   CXXScopeSpec SS;
7694   SS.Adopt(QualifierLoc);
7695   bool Dependent = false;
7696   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7697   case Sema::IER_Exists:
7698     if (S->isIfExists())
7699       break;
7700
7701     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7702
7703   case Sema::IER_DoesNotExist:
7704     if (S->isIfNotExists())
7705       break;
7706
7707     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7708
7709   case Sema::IER_Dependent:
7710     Dependent = true;
7711     break;
7712
7713   case Sema::IER_Error:
7714     return StmtError();
7715   }
7716
7717   // We need to continue with the instantiation, so do so now.
7718   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7719   if (SubStmt.isInvalid())
7720     return StmtError();
7721
7722   // If we have resolved the name, just transform to the substatement.
7723   if (!Dependent)
7724     return SubStmt;
7725
7726   // The name is still dependent, so build a dependent expression again.
7727   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7728                                                    S->isIfExists(),
7729                                                    QualifierLoc,
7730                                                    NameInfo,
7731                                                    SubStmt.get());
7732 }
7733
7734 template<typename Derived>
7735 ExprResult
7736 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7737   NestedNameSpecifierLoc QualifierLoc;
7738   if (E->getQualifierLoc()) {
7739     QualifierLoc
7740     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7741     if (!QualifierLoc)
7742       return ExprError();
7743   }
7744
7745   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7746     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7747   if (!PD)
7748     return ExprError();
7749
7750   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7751   if (Base.isInvalid())
7752     return ExprError();
7753
7754   return new (SemaRef.getASTContext())
7755       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7756                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7757                         QualifierLoc, E->getMemberLoc());
7758 }
7759
7760 template <typename Derived>
7761 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7762     MSPropertySubscriptExpr *E) {
7763   auto BaseRes = getDerived().TransformExpr(E->getBase());
7764   if (BaseRes.isInvalid())
7765     return ExprError();
7766   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7767   if (IdxRes.isInvalid())
7768     return ExprError();
7769
7770   if (!getDerived().AlwaysRebuild() &&
7771       BaseRes.get() == E->getBase() &&
7772       IdxRes.get() == E->getIdx())
7773     return E;
7774
7775   return getDerived().RebuildArraySubscriptExpr(
7776       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7777 }
7778
7779 template <typename Derived>
7780 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7781   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7782   if (TryBlock.isInvalid())
7783     return StmtError();
7784
7785   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7786   if (Handler.isInvalid())
7787     return StmtError();
7788
7789   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7790       Handler.get() == S->getHandler())
7791     return S;
7792
7793   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7794                                         TryBlock.get(), Handler.get());
7795 }
7796
7797 template <typename Derived>
7798 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7799   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7800   if (Block.isInvalid())
7801     return StmtError();
7802
7803   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7804 }
7805
7806 template <typename Derived>
7807 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7808   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7809   if (FilterExpr.isInvalid())
7810     return StmtError();
7811
7812   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7813   if (Block.isInvalid())
7814     return StmtError();
7815
7816   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7817                                            Block.get());
7818 }
7819
7820 template <typename Derived>
7821 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7822   if (isa<SEHFinallyStmt>(Handler))
7823     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7824   else
7825     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7826 }
7827
7828 template<typename Derived>
7829 StmtResult
7830 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7831   return S;
7832 }
7833
7834 //===----------------------------------------------------------------------===//
7835 // OpenMP directive transformation
7836 //===----------------------------------------------------------------------===//
7837 template <typename Derived>
7838 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7839     OMPExecutableDirective *D) {
7840
7841   // Transform the clauses
7842   llvm::SmallVector<OMPClause *, 16> TClauses;
7843   ArrayRef<OMPClause *> Clauses = D->clauses();
7844   TClauses.reserve(Clauses.size());
7845   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7846        I != E; ++I) {
7847     if (*I) {
7848       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7849       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7850       getDerived().getSema().EndOpenMPClause();
7851       if (Clause)
7852         TClauses.push_back(Clause);
7853     } else {
7854       TClauses.push_back(nullptr);
7855     }
7856   }
7857   StmtResult AssociatedStmt;
7858   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7859     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7860                                                   /*CurScope=*/nullptr);
7861     StmtResult Body;
7862     {
7863       Sema::CompoundScopeRAII CompoundScope(getSema());
7864       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
7865       Body = getDerived().TransformStmt(CS);
7866     }
7867     AssociatedStmt =
7868         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7869     if (AssociatedStmt.isInvalid()) {
7870       return StmtError();
7871     }
7872   }
7873   if (TClauses.size() != Clauses.size()) {
7874     return StmtError();
7875   }
7876
7877   // Transform directive name for 'omp critical' directive.
7878   DeclarationNameInfo DirName;
7879   if (D->getDirectiveKind() == OMPD_critical) {
7880     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7881     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7882   }
7883   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7884   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7885     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7886   } else if (D->getDirectiveKind() == OMPD_cancel) {
7887     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7888   }
7889
7890   return getDerived().RebuildOMPExecutableDirective(
7891       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7892       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
7893 }
7894
7895 template <typename Derived>
7896 StmtResult
7897 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7898   DeclarationNameInfo DirName;
7899   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7900                                              D->getBeginLoc());
7901   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7902   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7903   return Res;
7904 }
7905
7906 template <typename Derived>
7907 StmtResult
7908 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7909   DeclarationNameInfo DirName;
7910   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7911                                              D->getBeginLoc());
7912   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7913   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7914   return Res;
7915 }
7916
7917 template <typename Derived>
7918 StmtResult
7919 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7920   DeclarationNameInfo DirName;
7921   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7922                                              D->getBeginLoc());
7923   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7924   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7925   return Res;
7926 }
7927
7928 template <typename Derived>
7929 StmtResult
7930 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7931   DeclarationNameInfo DirName;
7932   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7933                                              D->getBeginLoc());
7934   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7935   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7936   return Res;
7937 }
7938
7939 template <typename Derived>
7940 StmtResult
7941 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7942   DeclarationNameInfo DirName;
7943   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7944                                              D->getBeginLoc());
7945   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7946   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7947   return Res;
7948 }
7949
7950 template <typename Derived>
7951 StmtResult
7952 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7953   DeclarationNameInfo DirName;
7954   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7955                                              D->getBeginLoc());
7956   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7957   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7958   return Res;
7959 }
7960
7961 template <typename Derived>
7962 StmtResult
7963 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7964   DeclarationNameInfo DirName;
7965   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7966                                              D->getBeginLoc());
7967   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7968   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7969   return Res;
7970 }
7971
7972 template <typename Derived>
7973 StmtResult
7974 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7975   DeclarationNameInfo DirName;
7976   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7977                                              D->getBeginLoc());
7978   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7979   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7980   return Res;
7981 }
7982
7983 template <typename Derived>
7984 StmtResult
7985 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7986   getDerived().getSema().StartOpenMPDSABlock(
7987       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
7988   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7989   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7990   return Res;
7991 }
7992
7993 template <typename Derived>
7994 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7995     OMPParallelForDirective *D) {
7996   DeclarationNameInfo DirName;
7997   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7998                                              nullptr, D->getBeginLoc());
7999   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8000   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8001   return Res;
8002 }
8003
8004 template <typename Derived>
8005 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8006     OMPParallelForSimdDirective *D) {
8007   DeclarationNameInfo DirName;
8008   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8009                                              nullptr, D->getBeginLoc());
8010   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8011   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8012   return Res;
8013 }
8014
8015 template <typename Derived>
8016 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8017     OMPParallelSectionsDirective *D) {
8018   DeclarationNameInfo DirName;
8019   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8020                                              nullptr, D->getBeginLoc());
8021   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8022   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8023   return Res;
8024 }
8025
8026 template <typename Derived>
8027 StmtResult
8028 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8029   DeclarationNameInfo DirName;
8030   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8031                                              D->getBeginLoc());
8032   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8033   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8034   return Res;
8035 }
8036
8037 template <typename Derived>
8038 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8039     OMPTaskyieldDirective *D) {
8040   DeclarationNameInfo DirName;
8041   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8042                                              D->getBeginLoc());
8043   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8045   return Res;
8046 }
8047
8048 template <typename Derived>
8049 StmtResult
8050 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8051   DeclarationNameInfo DirName;
8052   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8053                                              D->getBeginLoc());
8054   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8055   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8056   return Res;
8057 }
8058
8059 template <typename Derived>
8060 StmtResult
8061 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8062   DeclarationNameInfo DirName;
8063   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8064                                              D->getBeginLoc());
8065   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8066   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8067   return Res;
8068 }
8069
8070 template <typename Derived>
8071 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8072     OMPTaskgroupDirective *D) {
8073   DeclarationNameInfo DirName;
8074   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8075                                              D->getBeginLoc());
8076   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8077   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8078   return Res;
8079 }
8080
8081 template <typename Derived>
8082 StmtResult
8083 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8084   DeclarationNameInfo DirName;
8085   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8086                                              D->getBeginLoc());
8087   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8088   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8089   return Res;
8090 }
8091
8092 template <typename Derived>
8093 StmtResult
8094 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8095   DeclarationNameInfo DirName;
8096   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8097                                              D->getBeginLoc());
8098   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8099   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8100   return Res;
8101 }
8102
8103 template <typename Derived>
8104 StmtResult
8105 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8106   DeclarationNameInfo DirName;
8107   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8108                                              D->getBeginLoc());
8109   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8110   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8111   return Res;
8112 }
8113
8114 template <typename Derived>
8115 StmtResult
8116 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8117   DeclarationNameInfo DirName;
8118   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8119                                              D->getBeginLoc());
8120   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8121   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8122   return Res;
8123 }
8124
8125 template <typename Derived>
8126 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8127     OMPTargetDataDirective *D) {
8128   DeclarationNameInfo DirName;
8129   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8130                                              D->getBeginLoc());
8131   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8132   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8133   return Res;
8134 }
8135
8136 template <typename Derived>
8137 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8138     OMPTargetEnterDataDirective *D) {
8139   DeclarationNameInfo DirName;
8140   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8141                                              nullptr, D->getBeginLoc());
8142   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8144   return Res;
8145 }
8146
8147 template <typename Derived>
8148 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8149     OMPTargetExitDataDirective *D) {
8150   DeclarationNameInfo DirName;
8151   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8152                                              nullptr, D->getBeginLoc());
8153   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8154   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8155   return Res;
8156 }
8157
8158 template <typename Derived>
8159 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8160     OMPTargetParallelDirective *D) {
8161   DeclarationNameInfo DirName;
8162   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8163                                              nullptr, D->getBeginLoc());
8164   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8165   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8166   return Res;
8167 }
8168
8169 template <typename Derived>
8170 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8171     OMPTargetParallelForDirective *D) {
8172   DeclarationNameInfo DirName;
8173   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8174                                              nullptr, D->getBeginLoc());
8175   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8176   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8177   return Res;
8178 }
8179
8180 template <typename Derived>
8181 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8182     OMPTargetUpdateDirective *D) {
8183   DeclarationNameInfo DirName;
8184   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8185                                              nullptr, D->getBeginLoc());
8186   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8187   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8188   return Res;
8189 }
8190
8191 template <typename Derived>
8192 StmtResult
8193 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8194   DeclarationNameInfo DirName;
8195   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8196                                              D->getBeginLoc());
8197   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8198   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8199   return Res;
8200 }
8201
8202 template <typename Derived>
8203 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8204     OMPCancellationPointDirective *D) {
8205   DeclarationNameInfo DirName;
8206   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8207                                              nullptr, D->getBeginLoc());
8208   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8209   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8210   return Res;
8211 }
8212
8213 template <typename Derived>
8214 StmtResult
8215 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8216   DeclarationNameInfo DirName;
8217   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8218                                              D->getBeginLoc());
8219   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8220   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8221   return Res;
8222 }
8223
8224 template <typename Derived>
8225 StmtResult
8226 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8227   DeclarationNameInfo DirName;
8228   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8229                                              D->getBeginLoc());
8230   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8231   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8232   return Res;
8233 }
8234
8235 template <typename Derived>
8236 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8237     OMPTaskLoopSimdDirective *D) {
8238   DeclarationNameInfo DirName;
8239   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8240                                              nullptr, D->getBeginLoc());
8241   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8242   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8243   return Res;
8244 }
8245
8246 template <typename Derived>
8247 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8248     OMPDistributeDirective *D) {
8249   DeclarationNameInfo DirName;
8250   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8251                                              D->getBeginLoc());
8252   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8253   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8254   return Res;
8255 }
8256
8257 template <typename Derived>
8258 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8259     OMPDistributeParallelForDirective *D) {
8260   DeclarationNameInfo DirName;
8261   getDerived().getSema().StartOpenMPDSABlock(
8262       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8263   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8264   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8265   return Res;
8266 }
8267
8268 template <typename Derived>
8269 StmtResult
8270 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8271     OMPDistributeParallelForSimdDirective *D) {
8272   DeclarationNameInfo DirName;
8273   getDerived().getSema().StartOpenMPDSABlock(
8274       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8275   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8276   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8277   return Res;
8278 }
8279
8280 template <typename Derived>
8281 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8282     OMPDistributeSimdDirective *D) {
8283   DeclarationNameInfo DirName;
8284   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8285                                              nullptr, D->getBeginLoc());
8286   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8287   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8288   return Res;
8289 }
8290
8291 template <typename Derived>
8292 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8293     OMPTargetParallelForSimdDirective *D) {
8294   DeclarationNameInfo DirName;
8295   getDerived().getSema().StartOpenMPDSABlock(
8296       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8297   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8298   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8299   return Res;
8300 }
8301
8302 template <typename Derived>
8303 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8304     OMPTargetSimdDirective *D) {
8305   DeclarationNameInfo DirName;
8306   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8307                                              D->getBeginLoc());
8308   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8309   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8310   return Res;
8311 }
8312
8313 template <typename Derived>
8314 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8315     OMPTeamsDistributeDirective *D) {
8316   DeclarationNameInfo DirName;
8317   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8318                                              nullptr, D->getBeginLoc());
8319   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8320   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8321   return Res;
8322 }
8323
8324 template <typename Derived>
8325 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8326     OMPTeamsDistributeSimdDirective *D) {
8327   DeclarationNameInfo DirName;
8328   getDerived().getSema().StartOpenMPDSABlock(
8329       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8330   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8331   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8332   return Res;
8333 }
8334
8335 template <typename Derived>
8336 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8337     OMPTeamsDistributeParallelForSimdDirective *D) {
8338   DeclarationNameInfo DirName;
8339   getDerived().getSema().StartOpenMPDSABlock(
8340       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8341       D->getBeginLoc());
8342   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8343   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8344   return Res;
8345 }
8346
8347 template <typename Derived>
8348 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8349     OMPTeamsDistributeParallelForDirective *D) {
8350   DeclarationNameInfo DirName;
8351   getDerived().getSema().StartOpenMPDSABlock(
8352       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8353   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8354   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8355   return Res;
8356 }
8357
8358 template <typename Derived>
8359 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8360     OMPTargetTeamsDirective *D) {
8361   DeclarationNameInfo DirName;
8362   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8363                                              nullptr, D->getBeginLoc());
8364   auto Res = getDerived().TransformOMPExecutableDirective(D);
8365   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8366   return Res;
8367 }
8368
8369 template <typename Derived>
8370 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8371     OMPTargetTeamsDistributeDirective *D) {
8372   DeclarationNameInfo DirName;
8373   getDerived().getSema().StartOpenMPDSABlock(
8374       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8375   auto Res = getDerived().TransformOMPExecutableDirective(D);
8376   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8377   return Res;
8378 }
8379
8380 template <typename Derived>
8381 StmtResult
8382 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8383     OMPTargetTeamsDistributeParallelForDirective *D) {
8384   DeclarationNameInfo DirName;
8385   getDerived().getSema().StartOpenMPDSABlock(
8386       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8387       D->getBeginLoc());
8388   auto Res = getDerived().TransformOMPExecutableDirective(D);
8389   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8390   return Res;
8391 }
8392
8393 template <typename Derived>
8394 StmtResult TreeTransform<Derived>::
8395     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8396         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8397   DeclarationNameInfo DirName;
8398   getDerived().getSema().StartOpenMPDSABlock(
8399       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8400       D->getBeginLoc());
8401   auto Res = getDerived().TransformOMPExecutableDirective(D);
8402   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8403   return Res;
8404 }
8405
8406 template <typename Derived>
8407 StmtResult
8408 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8409     OMPTargetTeamsDistributeSimdDirective *D) {
8410   DeclarationNameInfo DirName;
8411   getDerived().getSema().StartOpenMPDSABlock(
8412       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8413   auto Res = getDerived().TransformOMPExecutableDirective(D);
8414   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8415   return Res;
8416 }
8417
8418
8419 //===----------------------------------------------------------------------===//
8420 // OpenMP clause transformation
8421 //===----------------------------------------------------------------------===//
8422 template <typename Derived>
8423 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8424   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8425   if (Cond.isInvalid())
8426     return nullptr;
8427   return getDerived().RebuildOMPIfClause(
8428       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8429       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8430 }
8431
8432 template <typename Derived>
8433 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8434   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8435   if (Cond.isInvalid())
8436     return nullptr;
8437   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8438                                             C->getLParenLoc(), C->getEndLoc());
8439 }
8440
8441 template <typename Derived>
8442 OMPClause *
8443 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8444   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8445   if (NumThreads.isInvalid())
8446     return nullptr;
8447   return getDerived().RebuildOMPNumThreadsClause(
8448       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8449 }
8450
8451 template <typename Derived>
8452 OMPClause *
8453 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8454   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8455   if (E.isInvalid())
8456     return nullptr;
8457   return getDerived().RebuildOMPSafelenClause(
8458       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8459 }
8460
8461 template <typename Derived>
8462 OMPClause *
8463 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8464   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8465   if (E.isInvalid())
8466     return nullptr;
8467   return getDerived().RebuildOMPAllocatorClause(
8468       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8469 }
8470
8471 template <typename Derived>
8472 OMPClause *
8473 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8474   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8475   if (E.isInvalid())
8476     return nullptr;
8477   return getDerived().RebuildOMPSimdlenClause(
8478       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8479 }
8480
8481 template <typename Derived>
8482 OMPClause *
8483 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8484   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8485   if (E.isInvalid())
8486     return nullptr;
8487   return getDerived().RebuildOMPCollapseClause(
8488       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8489 }
8490
8491 template <typename Derived>
8492 OMPClause *
8493 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8494   return getDerived().RebuildOMPDefaultClause(
8495       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8496       C->getLParenLoc(), C->getEndLoc());
8497 }
8498
8499 template <typename Derived>
8500 OMPClause *
8501 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8502   return getDerived().RebuildOMPProcBindClause(
8503       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8504       C->getLParenLoc(), C->getEndLoc());
8505 }
8506
8507 template <typename Derived>
8508 OMPClause *
8509 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8510   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8511   if (E.isInvalid())
8512     return nullptr;
8513   return getDerived().RebuildOMPScheduleClause(
8514       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8515       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8516       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8517       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8518 }
8519
8520 template <typename Derived>
8521 OMPClause *
8522 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8523   ExprResult E;
8524   if (auto *Num = C->getNumForLoops()) {
8525     E = getDerived().TransformExpr(Num);
8526     if (E.isInvalid())
8527       return nullptr;
8528   }
8529   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8530                                               C->getLParenLoc(), E.get());
8531 }
8532
8533 template <typename Derived>
8534 OMPClause *
8535 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8536   // No need to rebuild this clause, no template-dependent parameters.
8537   return C;
8538 }
8539
8540 template <typename Derived>
8541 OMPClause *
8542 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8543   // No need to rebuild this clause, no template-dependent parameters.
8544   return C;
8545 }
8546
8547 template <typename Derived>
8548 OMPClause *
8549 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8550   // No need to rebuild this clause, no template-dependent parameters.
8551   return C;
8552 }
8553
8554 template <typename Derived>
8555 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8556   // No need to rebuild this clause, no template-dependent parameters.
8557   return C;
8558 }
8559
8560 template <typename Derived>
8561 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8562   // No need to rebuild this clause, no template-dependent parameters.
8563   return C;
8564 }
8565
8566 template <typename Derived>
8567 OMPClause *
8568 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8569   // No need to rebuild this clause, no template-dependent parameters.
8570   return C;
8571 }
8572
8573 template <typename Derived>
8574 OMPClause *
8575 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8576   // No need to rebuild this clause, no template-dependent parameters.
8577   return C;
8578 }
8579
8580 template <typename Derived>
8581 OMPClause *
8582 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8583   // No need to rebuild this clause, no template-dependent parameters.
8584   return C;
8585 }
8586
8587 template <typename Derived>
8588 OMPClause *
8589 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8590   // No need to rebuild this clause, no template-dependent parameters.
8591   return C;
8592 }
8593
8594 template <typename Derived>
8595 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8596   // No need to rebuild this clause, no template-dependent parameters.
8597   return C;
8598 }
8599
8600 template <typename Derived>
8601 OMPClause *
8602 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8603   // No need to rebuild this clause, no template-dependent parameters.
8604   return C;
8605 }
8606
8607 template <typename Derived>
8608 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8609     OMPUnifiedAddressClause *C) {
8610   llvm_unreachable("unified_address clause cannot appear in dependent context");
8611 }
8612
8613 template <typename Derived>
8614 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8615     OMPUnifiedSharedMemoryClause *C) {
8616   llvm_unreachable(
8617       "unified_shared_memory clause cannot appear in dependent context");
8618 }
8619
8620 template <typename Derived>
8621 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8622     OMPReverseOffloadClause *C) {
8623   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8624 }
8625
8626 template <typename Derived>
8627 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8628     OMPDynamicAllocatorsClause *C) {
8629   llvm_unreachable(
8630       "dynamic_allocators clause cannot appear in dependent context");
8631 }
8632
8633 template <typename Derived>
8634 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8635     OMPAtomicDefaultMemOrderClause *C) {
8636   llvm_unreachable(
8637       "atomic_default_mem_order clause cannot appear in dependent context");
8638 }
8639
8640 template <typename Derived>
8641 OMPClause *
8642 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8643   llvm::SmallVector<Expr *, 16> Vars;
8644   Vars.reserve(C->varlist_size());
8645   for (auto *VE : C->varlists()) {
8646     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8647     if (EVar.isInvalid())
8648       return nullptr;
8649     Vars.push_back(EVar.get());
8650   }
8651   return getDerived().RebuildOMPPrivateClause(
8652       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8653 }
8654
8655 template <typename Derived>
8656 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8657     OMPFirstprivateClause *C) {
8658   llvm::SmallVector<Expr *, 16> Vars;
8659   Vars.reserve(C->varlist_size());
8660   for (auto *VE : C->varlists()) {
8661     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8662     if (EVar.isInvalid())
8663       return nullptr;
8664     Vars.push_back(EVar.get());
8665   }
8666   return getDerived().RebuildOMPFirstprivateClause(
8667       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8668 }
8669
8670 template <typename Derived>
8671 OMPClause *
8672 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8673   llvm::SmallVector<Expr *, 16> Vars;
8674   Vars.reserve(C->varlist_size());
8675   for (auto *VE : C->varlists()) {
8676     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8677     if (EVar.isInvalid())
8678       return nullptr;
8679     Vars.push_back(EVar.get());
8680   }
8681   return getDerived().RebuildOMPLastprivateClause(
8682       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8683 }
8684
8685 template <typename Derived>
8686 OMPClause *
8687 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8688   llvm::SmallVector<Expr *, 16> Vars;
8689   Vars.reserve(C->varlist_size());
8690   for (auto *VE : C->varlists()) {
8691     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8692     if (EVar.isInvalid())
8693       return nullptr;
8694     Vars.push_back(EVar.get());
8695   }
8696   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8697                                              C->getLParenLoc(), C->getEndLoc());
8698 }
8699
8700 template <typename Derived>
8701 OMPClause *
8702 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8703   llvm::SmallVector<Expr *, 16> Vars;
8704   Vars.reserve(C->varlist_size());
8705   for (auto *VE : C->varlists()) {
8706     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8707     if (EVar.isInvalid())
8708       return nullptr;
8709     Vars.push_back(EVar.get());
8710   }
8711   CXXScopeSpec ReductionIdScopeSpec;
8712   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8713
8714   DeclarationNameInfo NameInfo = C->getNameInfo();
8715   if (NameInfo.getName()) {
8716     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8717     if (!NameInfo.getName())
8718       return nullptr;
8719   }
8720   // Build a list of all UDR decls with the same names ranged by the Scopes.
8721   // The Scope boundary is a duplication of the previous decl.
8722   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8723   for (auto *E : C->reduction_ops()) {
8724     // Transform all the decls.
8725     if (E) {
8726       auto *ULE = cast<UnresolvedLookupExpr>(E);
8727       UnresolvedSet<8> Decls;
8728       for (auto *D : ULE->decls()) {
8729         NamedDecl *InstD =
8730             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8731         Decls.addDecl(InstD, InstD->getAccess());
8732       }
8733       UnresolvedReductions.push_back(
8734        UnresolvedLookupExpr::Create(
8735           SemaRef.Context, /*NamingClass=*/nullptr,
8736           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8737           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8738           Decls.begin(), Decls.end()));
8739     } else
8740       UnresolvedReductions.push_back(nullptr);
8741   }
8742   return getDerived().RebuildOMPReductionClause(
8743       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8744       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8745 }
8746
8747 template <typename Derived>
8748 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8749     OMPTaskReductionClause *C) {
8750   llvm::SmallVector<Expr *, 16> Vars;
8751   Vars.reserve(C->varlist_size());
8752   for (auto *VE : C->varlists()) {
8753     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8754     if (EVar.isInvalid())
8755       return nullptr;
8756     Vars.push_back(EVar.get());
8757   }
8758   CXXScopeSpec ReductionIdScopeSpec;
8759   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8760
8761   DeclarationNameInfo NameInfo = C->getNameInfo();
8762   if (NameInfo.getName()) {
8763     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8764     if (!NameInfo.getName())
8765       return nullptr;
8766   }
8767   // Build a list of all UDR decls with the same names ranged by the Scopes.
8768   // The Scope boundary is a duplication of the previous decl.
8769   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8770   for (auto *E : C->reduction_ops()) {
8771     // Transform all the decls.
8772     if (E) {
8773       auto *ULE = cast<UnresolvedLookupExpr>(E);
8774       UnresolvedSet<8> Decls;
8775       for (auto *D : ULE->decls()) {
8776         NamedDecl *InstD =
8777             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8778         Decls.addDecl(InstD, InstD->getAccess());
8779       }
8780       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8781           SemaRef.Context, /*NamingClass=*/nullptr,
8782           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8783           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8784     } else
8785       UnresolvedReductions.push_back(nullptr);
8786   }
8787   return getDerived().RebuildOMPTaskReductionClause(
8788       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8789       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8790 }
8791
8792 template <typename Derived>
8793 OMPClause *
8794 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8795   llvm::SmallVector<Expr *, 16> Vars;
8796   Vars.reserve(C->varlist_size());
8797   for (auto *VE : C->varlists()) {
8798     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8799     if (EVar.isInvalid())
8800       return nullptr;
8801     Vars.push_back(EVar.get());
8802   }
8803   CXXScopeSpec ReductionIdScopeSpec;
8804   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8805
8806   DeclarationNameInfo NameInfo = C->getNameInfo();
8807   if (NameInfo.getName()) {
8808     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8809     if (!NameInfo.getName())
8810       return nullptr;
8811   }
8812   // Build a list of all UDR decls with the same names ranged by the Scopes.
8813   // The Scope boundary is a duplication of the previous decl.
8814   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8815   for (auto *E : C->reduction_ops()) {
8816     // Transform all the decls.
8817     if (E) {
8818       auto *ULE = cast<UnresolvedLookupExpr>(E);
8819       UnresolvedSet<8> Decls;
8820       for (auto *D : ULE->decls()) {
8821         NamedDecl *InstD =
8822             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8823         Decls.addDecl(InstD, InstD->getAccess());
8824       }
8825       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8826           SemaRef.Context, /*NamingClass=*/nullptr,
8827           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8828           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8829     } else
8830       UnresolvedReductions.push_back(nullptr);
8831   }
8832   return getDerived().RebuildOMPInReductionClause(
8833       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8834       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8835 }
8836
8837 template <typename Derived>
8838 OMPClause *
8839 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8840   llvm::SmallVector<Expr *, 16> Vars;
8841   Vars.reserve(C->varlist_size());
8842   for (auto *VE : C->varlists()) {
8843     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8844     if (EVar.isInvalid())
8845       return nullptr;
8846     Vars.push_back(EVar.get());
8847   }
8848   ExprResult Step = getDerived().TransformExpr(C->getStep());
8849   if (Step.isInvalid())
8850     return nullptr;
8851   return getDerived().RebuildOMPLinearClause(
8852       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
8853       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
8854 }
8855
8856 template <typename Derived>
8857 OMPClause *
8858 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8859   llvm::SmallVector<Expr *, 16> Vars;
8860   Vars.reserve(C->varlist_size());
8861   for (auto *VE : C->varlists()) {
8862     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8863     if (EVar.isInvalid())
8864       return nullptr;
8865     Vars.push_back(EVar.get());
8866   }
8867   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8868   if (Alignment.isInvalid())
8869     return nullptr;
8870   return getDerived().RebuildOMPAlignedClause(
8871       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
8872       C->getColonLoc(), C->getEndLoc());
8873 }
8874
8875 template <typename Derived>
8876 OMPClause *
8877 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8878   llvm::SmallVector<Expr *, 16> Vars;
8879   Vars.reserve(C->varlist_size());
8880   for (auto *VE : C->varlists()) {
8881     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8882     if (EVar.isInvalid())
8883       return nullptr;
8884     Vars.push_back(EVar.get());
8885   }
8886   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
8887                                              C->getLParenLoc(), C->getEndLoc());
8888 }
8889
8890 template <typename Derived>
8891 OMPClause *
8892 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8893   llvm::SmallVector<Expr *, 16> Vars;
8894   Vars.reserve(C->varlist_size());
8895   for (auto *VE : C->varlists()) {
8896     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8897     if (EVar.isInvalid())
8898       return nullptr;
8899     Vars.push_back(EVar.get());
8900   }
8901   return getDerived().RebuildOMPCopyprivateClause(
8902       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8903 }
8904
8905 template <typename Derived>
8906 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8907   llvm::SmallVector<Expr *, 16> Vars;
8908   Vars.reserve(C->varlist_size());
8909   for (auto *VE : C->varlists()) {
8910     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8911     if (EVar.isInvalid())
8912       return nullptr;
8913     Vars.push_back(EVar.get());
8914   }
8915   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
8916                                             C->getLParenLoc(), C->getEndLoc());
8917 }
8918
8919 template <typename Derived>
8920 OMPClause *
8921 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8922   llvm::SmallVector<Expr *, 16> Vars;
8923   Vars.reserve(C->varlist_size());
8924   for (auto *VE : C->varlists()) {
8925     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8926     if (EVar.isInvalid())
8927       return nullptr;
8928     Vars.push_back(EVar.get());
8929   }
8930   return getDerived().RebuildOMPDependClause(
8931       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8932       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8933 }
8934
8935 template <typename Derived>
8936 OMPClause *
8937 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8938   ExprResult E = getDerived().TransformExpr(C->getDevice());
8939   if (E.isInvalid())
8940     return nullptr;
8941   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
8942                                              C->getLParenLoc(), C->getEndLoc());
8943 }
8944
8945 template <typename Derived, class T>
8946 bool transformOMPMappableExprListClause(
8947     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
8948     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
8949     DeclarationNameInfo &MapperIdInfo,
8950     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
8951   // Transform expressions in the list.
8952   Vars.reserve(C->varlist_size());
8953   for (auto *VE : C->varlists()) {
8954     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
8955     if (EVar.isInvalid())
8956       return true;
8957     Vars.push_back(EVar.get());
8958   }
8959   // Transform mapper scope specifier and identifier.
8960   NestedNameSpecifierLoc QualifierLoc;
8961   if (C->getMapperQualifierLoc()) {
8962     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
8963         C->getMapperQualifierLoc());
8964     if (!QualifierLoc)
8965       return true;
8966   }
8967   MapperIdScopeSpec.Adopt(QualifierLoc);
8968   MapperIdInfo = C->getMapperIdInfo();
8969   if (MapperIdInfo.getName()) {
8970     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
8971     if (!MapperIdInfo.getName())
8972       return true;
8973   }
8974   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
8975   // the previous user-defined mapper lookup in dependent environment.
8976   for (auto *E : C->mapperlists()) {
8977     // Transform all the decls.
8978     if (E) {
8979       auto *ULE = cast<UnresolvedLookupExpr>(E);
8980       UnresolvedSet<8> Decls;
8981       for (auto *D : ULE->decls()) {
8982         NamedDecl *InstD =
8983             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
8984         Decls.addDecl(InstD, InstD->getAccess());
8985       }
8986       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
8987           TT.getSema().Context, /*NamingClass=*/nullptr,
8988           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
8989           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
8990           Decls.end()));
8991     } else {
8992       UnresolvedMappers.push_back(nullptr);
8993     }
8994   }
8995   return false;
8996 }
8997
8998 template <typename Derived>
8999 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9000   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9001   llvm::SmallVector<Expr *, 16> Vars;
9002   CXXScopeSpec MapperIdScopeSpec;
9003   DeclarationNameInfo MapperIdInfo;
9004   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9005   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9006           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9007     return nullptr;
9008   return getDerived().RebuildOMPMapClause(
9009       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9010       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9011       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9012 }
9013
9014 template <typename Derived>
9015 OMPClause *
9016 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9017   Expr *Allocator = C->getAllocator();
9018   if (Allocator) {
9019     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9020     if (AllocatorRes.isInvalid())
9021       return nullptr;
9022     Allocator = AllocatorRes.get();
9023   }
9024   llvm::SmallVector<Expr *, 16> Vars;
9025   Vars.reserve(C->varlist_size());
9026   for (auto *VE : C->varlists()) {
9027     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9028     if (EVar.isInvalid())
9029       return nullptr;
9030     Vars.push_back(EVar.get());
9031   }
9032   return getDerived().RebuildOMPAllocateClause(
9033       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9034       C->getEndLoc());
9035 }
9036
9037 template <typename Derived>
9038 OMPClause *
9039 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9040   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9041   if (E.isInvalid())
9042     return nullptr;
9043   return getDerived().RebuildOMPNumTeamsClause(
9044       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9045 }
9046
9047 template <typename Derived>
9048 OMPClause *
9049 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9050   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9051   if (E.isInvalid())
9052     return nullptr;
9053   return getDerived().RebuildOMPThreadLimitClause(
9054       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9055 }
9056
9057 template <typename Derived>
9058 OMPClause *
9059 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9060   ExprResult E = getDerived().TransformExpr(C->getPriority());
9061   if (E.isInvalid())
9062     return nullptr;
9063   return getDerived().RebuildOMPPriorityClause(
9064       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9065 }
9066
9067 template <typename Derived>
9068 OMPClause *
9069 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9070   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9071   if (E.isInvalid())
9072     return nullptr;
9073   return getDerived().RebuildOMPGrainsizeClause(
9074       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9075 }
9076
9077 template <typename Derived>
9078 OMPClause *
9079 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9080   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9081   if (E.isInvalid())
9082     return nullptr;
9083   return getDerived().RebuildOMPNumTasksClause(
9084       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9085 }
9086
9087 template <typename Derived>
9088 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9089   ExprResult E = getDerived().TransformExpr(C->getHint());
9090   if (E.isInvalid())
9091     return nullptr;
9092   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9093                                            C->getLParenLoc(), C->getEndLoc());
9094 }
9095
9096 template <typename Derived>
9097 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9098     OMPDistScheduleClause *C) {
9099   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9100   if (E.isInvalid())
9101     return nullptr;
9102   return getDerived().RebuildOMPDistScheduleClause(
9103       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9104       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9105 }
9106
9107 template <typename Derived>
9108 OMPClause *
9109 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9110   return C;
9111 }
9112
9113 template <typename Derived>
9114 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9115   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9116   llvm::SmallVector<Expr *, 16> Vars;
9117   CXXScopeSpec MapperIdScopeSpec;
9118   DeclarationNameInfo MapperIdInfo;
9119   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9120   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9121           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9122     return nullptr;
9123   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9124                                          Locs, UnresolvedMappers);
9125 }
9126
9127 template <typename Derived>
9128 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9129   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9130   llvm::SmallVector<Expr *, 16> Vars;
9131   CXXScopeSpec MapperIdScopeSpec;
9132   DeclarationNameInfo MapperIdInfo;
9133   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9134   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9135           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9136     return nullptr;
9137   return getDerived().RebuildOMPFromClause(
9138       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9139 }
9140
9141 template <typename Derived>
9142 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9143     OMPUseDevicePtrClause *C) {
9144   llvm::SmallVector<Expr *, 16> Vars;
9145   Vars.reserve(C->varlist_size());
9146   for (auto *VE : C->varlists()) {
9147     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9148     if (EVar.isInvalid())
9149       return nullptr;
9150     Vars.push_back(EVar.get());
9151   }
9152   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9153   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9154 }
9155
9156 template <typename Derived>
9157 OMPClause *
9158 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9159   llvm::SmallVector<Expr *, 16> Vars;
9160   Vars.reserve(C->varlist_size());
9161   for (auto *VE : C->varlists()) {
9162     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9163     if (EVar.isInvalid())
9164       return nullptr;
9165     Vars.push_back(EVar.get());
9166   }
9167   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9168   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9169 }
9170
9171 //===----------------------------------------------------------------------===//
9172 // Expression transformation
9173 //===----------------------------------------------------------------------===//
9174 template<typename Derived>
9175 ExprResult
9176 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9177   return TransformExpr(E->getSubExpr());
9178 }
9179
9180 template<typename Derived>
9181 ExprResult
9182 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9183   if (!E->isTypeDependent())
9184     return E;
9185
9186   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9187                                             E->getIdentKind());
9188 }
9189
9190 template<typename Derived>
9191 ExprResult
9192 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9193   NestedNameSpecifierLoc QualifierLoc;
9194   if (E->getQualifierLoc()) {
9195     QualifierLoc
9196       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9197     if (!QualifierLoc)
9198       return ExprError();
9199   }
9200
9201   ValueDecl *ND
9202     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9203                                                          E->getDecl()));
9204   if (!ND)
9205     return ExprError();
9206
9207   DeclarationNameInfo NameInfo = E->getNameInfo();
9208   if (NameInfo.getName()) {
9209     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9210     if (!NameInfo.getName())
9211       return ExprError();
9212   }
9213
9214   if (!getDerived().AlwaysRebuild() &&
9215       QualifierLoc == E->getQualifierLoc() &&
9216       ND == E->getDecl() &&
9217       NameInfo.getName() == E->getDecl()->getDeclName() &&
9218       !E->hasExplicitTemplateArgs()) {
9219
9220     // Mark it referenced in the new context regardless.
9221     // FIXME: this is a bit instantiation-specific.
9222     SemaRef.MarkDeclRefReferenced(E);
9223
9224     return E;
9225   }
9226
9227   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9228   if (E->hasExplicitTemplateArgs()) {
9229     TemplateArgs = &TransArgs;
9230     TransArgs.setLAngleLoc(E->getLAngleLoc());
9231     TransArgs.setRAngleLoc(E->getRAngleLoc());
9232     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9233                                                 E->getNumTemplateArgs(),
9234                                                 TransArgs))
9235       return ExprError();
9236   }
9237
9238   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9239                                          TemplateArgs);
9240 }
9241
9242 template<typename Derived>
9243 ExprResult
9244 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9245   return E;
9246 }
9247
9248 template <typename Derived>
9249 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9250     FixedPointLiteral *E) {
9251   return E;
9252 }
9253
9254 template<typename Derived>
9255 ExprResult
9256 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9257   return E;
9258 }
9259
9260 template<typename Derived>
9261 ExprResult
9262 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9263   return E;
9264 }
9265
9266 template<typename Derived>
9267 ExprResult
9268 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9269   return E;
9270 }
9271
9272 template<typename Derived>
9273 ExprResult
9274 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9275   return E;
9276 }
9277
9278 template<typename Derived>
9279 ExprResult
9280 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9281   if (FunctionDecl *FD = E->getDirectCallee())
9282     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9283   return SemaRef.MaybeBindToTemporary(E);
9284 }
9285
9286 template<typename Derived>
9287 ExprResult
9288 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9289   ExprResult ControllingExpr =
9290     getDerived().TransformExpr(E->getControllingExpr());
9291   if (ControllingExpr.isInvalid())
9292     return ExprError();
9293
9294   SmallVector<Expr *, 4> AssocExprs;
9295   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9296   for (const GenericSelectionExpr::Association &Assoc : E->associations()) {
9297     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9298     if (TSI) {
9299       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9300       if (!AssocType)
9301         return ExprError();
9302       AssocTypes.push_back(AssocType);
9303     } else {
9304       AssocTypes.push_back(nullptr);
9305     }
9306
9307     ExprResult AssocExpr =
9308         getDerived().TransformExpr(Assoc.getAssociationExpr());
9309     if (AssocExpr.isInvalid())
9310       return ExprError();
9311     AssocExprs.push_back(AssocExpr.get());
9312   }
9313
9314   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9315                                                   E->getDefaultLoc(),
9316                                                   E->getRParenLoc(),
9317                                                   ControllingExpr.get(),
9318                                                   AssocTypes,
9319                                                   AssocExprs);
9320 }
9321
9322 template<typename Derived>
9323 ExprResult
9324 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9325   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9326   if (SubExpr.isInvalid())
9327     return ExprError();
9328
9329   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9330     return E;
9331
9332   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9333                                        E->getRParen());
9334 }
9335
9336 /// The operand of a unary address-of operator has special rules: it's
9337 /// allowed to refer to a non-static member of a class even if there's no 'this'
9338 /// object available.
9339 template<typename Derived>
9340 ExprResult
9341 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9342   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9343     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9344   else
9345     return getDerived().TransformExpr(E);
9346 }
9347
9348 template<typename Derived>
9349 ExprResult
9350 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9351   ExprResult SubExpr;
9352   if (E->getOpcode() == UO_AddrOf)
9353     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9354   else
9355     SubExpr = TransformExpr(E->getSubExpr());
9356   if (SubExpr.isInvalid())
9357     return ExprError();
9358
9359   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9360     return E;
9361
9362   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9363                                            E->getOpcode(),
9364                                            SubExpr.get());
9365 }
9366
9367 template<typename Derived>
9368 ExprResult
9369 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9370   // Transform the type.
9371   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9372   if (!Type)
9373     return ExprError();
9374
9375   // Transform all of the components into components similar to what the
9376   // parser uses.
9377   // FIXME: It would be slightly more efficient in the non-dependent case to
9378   // just map FieldDecls, rather than requiring the rebuilder to look for
9379   // the fields again. However, __builtin_offsetof is rare enough in
9380   // template code that we don't care.
9381   bool ExprChanged = false;
9382   typedef Sema::OffsetOfComponent Component;
9383   SmallVector<Component, 4> Components;
9384   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9385     const OffsetOfNode &ON = E->getComponent(I);
9386     Component Comp;
9387     Comp.isBrackets = true;
9388     Comp.LocStart = ON.getSourceRange().getBegin();
9389     Comp.LocEnd = ON.getSourceRange().getEnd();
9390     switch (ON.getKind()) {
9391     case OffsetOfNode::Array: {
9392       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9393       ExprResult Index = getDerived().TransformExpr(FromIndex);
9394       if (Index.isInvalid())
9395         return ExprError();
9396
9397       ExprChanged = ExprChanged || Index.get() != FromIndex;
9398       Comp.isBrackets = true;
9399       Comp.U.E = Index.get();
9400       break;
9401     }
9402
9403     case OffsetOfNode::Field:
9404     case OffsetOfNode::Identifier:
9405       Comp.isBrackets = false;
9406       Comp.U.IdentInfo = ON.getFieldName();
9407       if (!Comp.U.IdentInfo)
9408         continue;
9409
9410       break;
9411
9412     case OffsetOfNode::Base:
9413       // Will be recomputed during the rebuild.
9414       continue;
9415     }
9416
9417     Components.push_back(Comp);
9418   }
9419
9420   // If nothing changed, retain the existing expression.
9421   if (!getDerived().AlwaysRebuild() &&
9422       Type == E->getTypeSourceInfo() &&
9423       !ExprChanged)
9424     return E;
9425
9426   // Build a new offsetof expression.
9427   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9428                                           Components, E->getRParenLoc());
9429 }
9430
9431 template<typename Derived>
9432 ExprResult
9433 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9434   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9435          "opaque value expression requires transformation");
9436   return E;
9437 }
9438
9439 template<typename Derived>
9440 ExprResult
9441 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9442   return E;
9443 }
9444
9445 template<typename Derived>
9446 ExprResult
9447 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9448   // Rebuild the syntactic form.  The original syntactic form has
9449   // opaque-value expressions in it, so strip those away and rebuild
9450   // the result.  This is a really awful way of doing this, but the
9451   // better solution (rebuilding the semantic expressions and
9452   // rebinding OVEs as necessary) doesn't work; we'd need
9453   // TreeTransform to not strip away implicit conversions.
9454   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9455   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9456   if (result.isInvalid()) return ExprError();
9457
9458   // If that gives us a pseudo-object result back, the pseudo-object
9459   // expression must have been an lvalue-to-rvalue conversion which we
9460   // should reapply.
9461   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9462     result = SemaRef.checkPseudoObjectRValue(result.get());
9463
9464   return result;
9465 }
9466
9467 template<typename Derived>
9468 ExprResult
9469 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9470                                                 UnaryExprOrTypeTraitExpr *E) {
9471   if (E->isArgumentType()) {
9472     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9473
9474     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9475     if (!NewT)
9476       return ExprError();
9477
9478     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9479       return E;
9480
9481     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9482                                                     E->getKind(),
9483                                                     E->getSourceRange());
9484   }
9485
9486   // C++0x [expr.sizeof]p1:
9487   //   The operand is either an expression, which is an unevaluated operand
9488   //   [...]
9489   EnterExpressionEvaluationContext Unevaluated(
9490       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9491       Sema::ReuseLambdaContextDecl);
9492
9493   // Try to recover if we have something like sizeof(T::X) where X is a type.
9494   // Notably, there must be *exactly* one set of parens if X is a type.
9495   TypeSourceInfo *RecoveryTSI = nullptr;
9496   ExprResult SubExpr;
9497   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9498   if (auto *DRE =
9499           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9500     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9501         PE, DRE, false, &RecoveryTSI);
9502   else
9503     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9504
9505   if (RecoveryTSI) {
9506     return getDerived().RebuildUnaryExprOrTypeTrait(
9507         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9508   } else if (SubExpr.isInvalid())
9509     return ExprError();
9510
9511   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9512     return E;
9513
9514   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9515                                                   E->getOperatorLoc(),
9516                                                   E->getKind(),
9517                                                   E->getSourceRange());
9518 }
9519
9520 template<typename Derived>
9521 ExprResult
9522 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9523   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9524   if (LHS.isInvalid())
9525     return ExprError();
9526
9527   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9528   if (RHS.isInvalid())
9529     return ExprError();
9530
9531
9532   if (!getDerived().AlwaysRebuild() &&
9533       LHS.get() == E->getLHS() &&
9534       RHS.get() == E->getRHS())
9535     return E;
9536
9537   return getDerived().RebuildArraySubscriptExpr(
9538       LHS.get(),
9539       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9540 }
9541
9542 template <typename Derived>
9543 ExprResult
9544 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9545   ExprResult Base = getDerived().TransformExpr(E->getBase());
9546   if (Base.isInvalid())
9547     return ExprError();
9548
9549   ExprResult LowerBound;
9550   if (E->getLowerBound()) {
9551     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9552     if (LowerBound.isInvalid())
9553       return ExprError();
9554   }
9555
9556   ExprResult Length;
9557   if (E->getLength()) {
9558     Length = getDerived().TransformExpr(E->getLength());
9559     if (Length.isInvalid())
9560       return ExprError();
9561   }
9562
9563   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9564       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9565     return E;
9566
9567   return getDerived().RebuildOMPArraySectionExpr(
9568       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9569       Length.get(), E->getRBracketLoc());
9570 }
9571
9572 template<typename Derived>
9573 ExprResult
9574 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9575   // Transform the callee.
9576   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9577   if (Callee.isInvalid())
9578     return ExprError();
9579
9580   // Transform arguments.
9581   bool ArgChanged = false;
9582   SmallVector<Expr*, 8> Args;
9583   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9584                                   &ArgChanged))
9585     return ExprError();
9586
9587   if (!getDerived().AlwaysRebuild() &&
9588       Callee.get() == E->getCallee() &&
9589       !ArgChanged)
9590     return SemaRef.MaybeBindToTemporary(E);
9591
9592   // FIXME: Wrong source location information for the '('.
9593   SourceLocation FakeLParenLoc
9594     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9595   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9596                                       Args,
9597                                       E->getRParenLoc());
9598 }
9599
9600 template<typename Derived>
9601 ExprResult
9602 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9603   ExprResult Base = getDerived().TransformExpr(E->getBase());
9604   if (Base.isInvalid())
9605     return ExprError();
9606
9607   NestedNameSpecifierLoc QualifierLoc;
9608   if (E->hasQualifier()) {
9609     QualifierLoc
9610       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9611
9612     if (!QualifierLoc)
9613       return ExprError();
9614   }
9615   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9616
9617   ValueDecl *Member
9618     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9619                                                          E->getMemberDecl()));
9620   if (!Member)
9621     return ExprError();
9622
9623   NamedDecl *FoundDecl = E->getFoundDecl();
9624   if (FoundDecl == E->getMemberDecl()) {
9625     FoundDecl = Member;
9626   } else {
9627     FoundDecl = cast_or_null<NamedDecl>(
9628                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9629     if (!FoundDecl)
9630       return ExprError();
9631   }
9632
9633   if (!getDerived().AlwaysRebuild() &&
9634       Base.get() == E->getBase() &&
9635       QualifierLoc == E->getQualifierLoc() &&
9636       Member == E->getMemberDecl() &&
9637       FoundDecl == E->getFoundDecl() &&
9638       !E->hasExplicitTemplateArgs()) {
9639
9640     // Mark it referenced in the new context regardless.
9641     // FIXME: this is a bit instantiation-specific.
9642     SemaRef.MarkMemberReferenced(E);
9643
9644     return E;
9645   }
9646
9647   TemplateArgumentListInfo TransArgs;
9648   if (E->hasExplicitTemplateArgs()) {
9649     TransArgs.setLAngleLoc(E->getLAngleLoc());
9650     TransArgs.setRAngleLoc(E->getRAngleLoc());
9651     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9652                                                 E->getNumTemplateArgs(),
9653                                                 TransArgs))
9654       return ExprError();
9655   }
9656
9657   // FIXME: Bogus source location for the operator
9658   SourceLocation FakeOperatorLoc =
9659       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9660
9661   // FIXME: to do this check properly, we will need to preserve the
9662   // first-qualifier-in-scope here, just in case we had a dependent
9663   // base (and therefore couldn't do the check) and a
9664   // nested-name-qualifier (and therefore could do the lookup).
9665   NamedDecl *FirstQualifierInScope = nullptr;
9666   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9667   if (MemberNameInfo.getName()) {
9668     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9669     if (!MemberNameInfo.getName())
9670       return ExprError();
9671   }
9672
9673   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9674                                         E->isArrow(),
9675                                         QualifierLoc,
9676                                         TemplateKWLoc,
9677                                         MemberNameInfo,
9678                                         Member,
9679                                         FoundDecl,
9680                                         (E->hasExplicitTemplateArgs()
9681                                            ? &TransArgs : nullptr),
9682                                         FirstQualifierInScope);
9683 }
9684
9685 template<typename Derived>
9686 ExprResult
9687 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9688   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9689   if (LHS.isInvalid())
9690     return ExprError();
9691
9692   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9693   if (RHS.isInvalid())
9694     return ExprError();
9695
9696   if (!getDerived().AlwaysRebuild() &&
9697       LHS.get() == E->getLHS() &&
9698       RHS.get() == E->getRHS())
9699     return E;
9700
9701   Sema::FPContractStateRAII FPContractState(getSema());
9702   getSema().FPFeatures = E->getFPFeatures();
9703
9704   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9705                                             LHS.get(), RHS.get());
9706 }
9707
9708 template<typename Derived>
9709 ExprResult
9710 TreeTransform<Derived>::TransformCompoundAssignOperator(
9711                                                       CompoundAssignOperator *E) {
9712   return getDerived().TransformBinaryOperator(E);
9713 }
9714
9715 template<typename Derived>
9716 ExprResult TreeTransform<Derived>::
9717 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9718   // Just rebuild the common and RHS expressions and see whether we
9719   // get any changes.
9720
9721   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9722   if (commonExpr.isInvalid())
9723     return ExprError();
9724
9725   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9726   if (rhs.isInvalid())
9727     return ExprError();
9728
9729   if (!getDerived().AlwaysRebuild() &&
9730       commonExpr.get() == e->getCommon() &&
9731       rhs.get() == e->getFalseExpr())
9732     return e;
9733
9734   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9735                                                  e->getQuestionLoc(),
9736                                                  nullptr,
9737                                                  e->getColonLoc(),
9738                                                  rhs.get());
9739 }
9740
9741 template<typename Derived>
9742 ExprResult
9743 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9744   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9745   if (Cond.isInvalid())
9746     return ExprError();
9747
9748   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9749   if (LHS.isInvalid())
9750     return ExprError();
9751
9752   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9753   if (RHS.isInvalid())
9754     return ExprError();
9755
9756   if (!getDerived().AlwaysRebuild() &&
9757       Cond.get() == E->getCond() &&
9758       LHS.get() == E->getLHS() &&
9759       RHS.get() == E->getRHS())
9760     return E;
9761
9762   return getDerived().RebuildConditionalOperator(Cond.get(),
9763                                                  E->getQuestionLoc(),
9764                                                  LHS.get(),
9765                                                  E->getColonLoc(),
9766                                                  RHS.get());
9767 }
9768
9769 template<typename Derived>
9770 ExprResult
9771 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9772   // Implicit casts are eliminated during transformation, since they
9773   // will be recomputed by semantic analysis after transformation.
9774   return getDerived().TransformExpr(E->getSubExprAsWritten());
9775 }
9776
9777 template<typename Derived>
9778 ExprResult
9779 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9780   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9781   if (!Type)
9782     return ExprError();
9783
9784   ExprResult SubExpr
9785     = getDerived().TransformExpr(E->getSubExprAsWritten());
9786   if (SubExpr.isInvalid())
9787     return ExprError();
9788
9789   if (!getDerived().AlwaysRebuild() &&
9790       Type == E->getTypeInfoAsWritten() &&
9791       SubExpr.get() == E->getSubExpr())
9792     return E;
9793
9794   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9795                                             Type,
9796                                             E->getRParenLoc(),
9797                                             SubExpr.get());
9798 }
9799
9800 template<typename Derived>
9801 ExprResult
9802 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9803   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9804   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9805   if (!NewT)
9806     return ExprError();
9807
9808   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9809   if (Init.isInvalid())
9810     return ExprError();
9811
9812   if (!getDerived().AlwaysRebuild() &&
9813       OldT == NewT &&
9814       Init.get() == E->getInitializer())
9815     return SemaRef.MaybeBindToTemporary(E);
9816
9817   // Note: the expression type doesn't necessarily match the
9818   // type-as-written, but that's okay, because it should always be
9819   // derivable from the initializer.
9820
9821   return getDerived().RebuildCompoundLiteralExpr(
9822       E->getLParenLoc(), NewT,
9823       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
9824 }
9825
9826 template<typename Derived>
9827 ExprResult
9828 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9829   ExprResult Base = getDerived().TransformExpr(E->getBase());
9830   if (Base.isInvalid())
9831     return ExprError();
9832
9833   if (!getDerived().AlwaysRebuild() &&
9834       Base.get() == E->getBase())
9835     return E;
9836
9837   // FIXME: Bad source location
9838   SourceLocation FakeOperatorLoc =
9839       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
9840   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9841                                                   E->getAccessorLoc(),
9842                                                   E->getAccessor());
9843 }
9844
9845 template<typename Derived>
9846 ExprResult
9847 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9848   if (InitListExpr *Syntactic = E->getSyntacticForm())
9849     E = Syntactic;
9850
9851   bool InitChanged = false;
9852
9853   EnterExpressionEvaluationContext Context(
9854       getSema(), EnterExpressionEvaluationContext::InitList);
9855
9856   SmallVector<Expr*, 4> Inits;
9857   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9858                                   Inits, &InitChanged))
9859     return ExprError();
9860
9861   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9862     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9863     // in some cases. We can't reuse it in general, because the syntactic and
9864     // semantic forms are linked, and we can't know that semantic form will
9865     // match even if the syntactic form does.
9866   }
9867
9868   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9869                                       E->getRBraceLoc());
9870 }
9871
9872 template<typename Derived>
9873 ExprResult
9874 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9875   Designation Desig;
9876
9877   // transform the initializer value
9878   ExprResult Init = getDerived().TransformExpr(E->getInit());
9879   if (Init.isInvalid())
9880     return ExprError();
9881
9882   // transform the designators.
9883   SmallVector<Expr*, 4> ArrayExprs;
9884   bool ExprChanged = false;
9885   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9886     if (D.isFieldDesignator()) {
9887       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9888                                                D.getDotLoc(),
9889                                                D.getFieldLoc()));
9890       if (D.getField()) {
9891         FieldDecl *Field = cast_or_null<FieldDecl>(
9892             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9893         if (Field != D.getField())
9894           // Rebuild the expression when the transformed FieldDecl is
9895           // different to the already assigned FieldDecl.
9896           ExprChanged = true;
9897       } else {
9898         // Ensure that the designator expression is rebuilt when there isn't
9899         // a resolved FieldDecl in the designator as we don't want to assign
9900         // a FieldDecl to a pattern designator that will be instantiated again.
9901         ExprChanged = true;
9902       }
9903       continue;
9904     }
9905
9906     if (D.isArrayDesignator()) {
9907       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9908       if (Index.isInvalid())
9909         return ExprError();
9910
9911       Desig.AddDesignator(
9912           Designator::getArray(Index.get(), D.getLBracketLoc()));
9913
9914       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9915       ArrayExprs.push_back(Index.get());
9916       continue;
9917     }
9918
9919     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9920     ExprResult Start
9921       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9922     if (Start.isInvalid())
9923       return ExprError();
9924
9925     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9926     if (End.isInvalid())
9927       return ExprError();
9928
9929     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9930                                                   End.get(),
9931                                                   D.getLBracketLoc(),
9932                                                   D.getEllipsisLoc()));
9933
9934     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9935                   End.get() != E->getArrayRangeEnd(D);
9936
9937     ArrayExprs.push_back(Start.get());
9938     ArrayExprs.push_back(End.get());
9939   }
9940
9941   if (!getDerived().AlwaysRebuild() &&
9942       Init.get() == E->getInit() &&
9943       !ExprChanged)
9944     return E;
9945
9946   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9947                                                 E->getEqualOrColonLoc(),
9948                                                 E->usesGNUSyntax(), Init.get());
9949 }
9950
9951 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9952 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9953 template<typename Derived>
9954 ExprResult
9955 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9956     DesignatedInitUpdateExpr *E) {
9957   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9958                    "initializer");
9959   return ExprError();
9960 }
9961
9962 template<typename Derived>
9963 ExprResult
9964 TreeTransform<Derived>::TransformNoInitExpr(
9965     NoInitExpr *E) {
9966   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9967   return ExprError();
9968 }
9969
9970 template<typename Derived>
9971 ExprResult
9972 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9973   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9974   return ExprError();
9975 }
9976
9977 template<typename Derived>
9978 ExprResult
9979 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9980   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9981   return ExprError();
9982 }
9983
9984 template<typename Derived>
9985 ExprResult
9986 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9987                                                      ImplicitValueInitExpr *E) {
9988   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
9989
9990   // FIXME: Will we ever have proper type location here? Will we actually
9991   // need to transform the type?
9992   QualType T = getDerived().TransformType(E->getType());
9993   if (T.isNull())
9994     return ExprError();
9995
9996   if (!getDerived().AlwaysRebuild() &&
9997       T == E->getType())
9998     return E;
9999
10000   return getDerived().RebuildImplicitValueInitExpr(T);
10001 }
10002
10003 template<typename Derived>
10004 ExprResult
10005 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10006   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10007   if (!TInfo)
10008     return ExprError();
10009
10010   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10011   if (SubExpr.isInvalid())
10012     return ExprError();
10013
10014   if (!getDerived().AlwaysRebuild() &&
10015       TInfo == E->getWrittenTypeInfo() &&
10016       SubExpr.get() == E->getSubExpr())
10017     return E;
10018
10019   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10020                                        TInfo, E->getRParenLoc());
10021 }
10022
10023 template<typename Derived>
10024 ExprResult
10025 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10026   bool ArgumentChanged = false;
10027   SmallVector<Expr*, 4> Inits;
10028   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10029                      &ArgumentChanged))
10030     return ExprError();
10031
10032   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10033                                            Inits,
10034                                            E->getRParenLoc());
10035 }
10036
10037 /// Transform an address-of-label expression.
10038 ///
10039 /// By default, the transformation of an address-of-label expression always
10040 /// rebuilds the expression, so that the label identifier can be resolved to
10041 /// the corresponding label statement by semantic analysis.
10042 template<typename Derived>
10043 ExprResult
10044 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10045   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10046                                         E->getLabel());
10047   if (!LD)
10048     return ExprError();
10049
10050   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10051                                            cast<LabelDecl>(LD));
10052 }
10053
10054 template<typename Derived>
10055 ExprResult
10056 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10057   SemaRef.ActOnStartStmtExpr();
10058   StmtResult SubStmt
10059     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10060   if (SubStmt.isInvalid()) {
10061     SemaRef.ActOnStmtExprError();
10062     return ExprError();
10063   }
10064
10065   if (!getDerived().AlwaysRebuild() &&
10066       SubStmt.get() == E->getSubStmt()) {
10067     // Calling this an 'error' is unintuitive, but it does the right thing.
10068     SemaRef.ActOnStmtExprError();
10069     return SemaRef.MaybeBindToTemporary(E);
10070   }
10071
10072   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
10073                                       SubStmt.get(),
10074                                       E->getRParenLoc());
10075 }
10076
10077 template<typename Derived>
10078 ExprResult
10079 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10080   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10081   if (Cond.isInvalid())
10082     return ExprError();
10083
10084   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10085   if (LHS.isInvalid())
10086     return ExprError();
10087
10088   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10089   if (RHS.isInvalid())
10090     return ExprError();
10091
10092   if (!getDerived().AlwaysRebuild() &&
10093       Cond.get() == E->getCond() &&
10094       LHS.get() == E->getLHS() &&
10095       RHS.get() == E->getRHS())
10096     return E;
10097
10098   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10099                                         Cond.get(), LHS.get(), RHS.get(),
10100                                         E->getRParenLoc());
10101 }
10102
10103 template<typename Derived>
10104 ExprResult
10105 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10106   return E;
10107 }
10108
10109 template<typename Derived>
10110 ExprResult
10111 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10112   switch (E->getOperator()) {
10113   case OO_New:
10114   case OO_Delete:
10115   case OO_Array_New:
10116   case OO_Array_Delete:
10117     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10118
10119   case OO_Call: {
10120     // This is a call to an object's operator().
10121     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10122
10123     // Transform the object itself.
10124     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10125     if (Object.isInvalid())
10126       return ExprError();
10127
10128     // FIXME: Poor location information
10129     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10130         static_cast<Expr *>(Object.get())->getEndLoc());
10131
10132     // Transform the call arguments.
10133     SmallVector<Expr*, 8> Args;
10134     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10135                                     Args))
10136       return ExprError();
10137
10138     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10139                                         E->getEndLoc());
10140   }
10141
10142 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10143   case OO_##Name:
10144 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10145 #include "clang/Basic/OperatorKinds.def"
10146   case OO_Subscript:
10147     // Handled below.
10148     break;
10149
10150   case OO_Conditional:
10151     llvm_unreachable("conditional operator is not actually overloadable");
10152
10153   case OO_None:
10154   case NUM_OVERLOADED_OPERATORS:
10155     llvm_unreachable("not an overloaded operator?");
10156   }
10157
10158   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10159   if (Callee.isInvalid())
10160     return ExprError();
10161
10162   ExprResult First;
10163   if (E->getOperator() == OO_Amp)
10164     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10165   else
10166     First = getDerived().TransformExpr(E->getArg(0));
10167   if (First.isInvalid())
10168     return ExprError();
10169
10170   ExprResult Second;
10171   if (E->getNumArgs() == 2) {
10172     Second = getDerived().TransformExpr(E->getArg(1));
10173     if (Second.isInvalid())
10174       return ExprError();
10175   }
10176
10177   if (!getDerived().AlwaysRebuild() &&
10178       Callee.get() == E->getCallee() &&
10179       First.get() == E->getArg(0) &&
10180       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10181     return SemaRef.MaybeBindToTemporary(E);
10182
10183   Sema::FPContractStateRAII FPContractState(getSema());
10184   getSema().FPFeatures = E->getFPFeatures();
10185
10186   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10187                                                  E->getOperatorLoc(),
10188                                                  Callee.get(),
10189                                                  First.get(),
10190                                                  Second.get());
10191 }
10192
10193 template<typename Derived>
10194 ExprResult
10195 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10196   return getDerived().TransformCallExpr(E);
10197 }
10198
10199 template <typename Derived>
10200 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
10201   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
10202                          getSema().CurContext != E->getParentContext();
10203
10204   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
10205     return E;
10206
10207   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
10208                                            E->getEndLoc(),
10209                                            getSema().CurContext);
10210 }
10211
10212 template<typename Derived>
10213 ExprResult
10214 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10215   // Transform the callee.
10216   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10217   if (Callee.isInvalid())
10218     return ExprError();
10219
10220   // Transform exec config.
10221   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10222   if (EC.isInvalid())
10223     return ExprError();
10224
10225   // Transform arguments.
10226   bool ArgChanged = false;
10227   SmallVector<Expr*, 8> Args;
10228   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10229                                   &ArgChanged))
10230     return ExprError();
10231
10232   if (!getDerived().AlwaysRebuild() &&
10233       Callee.get() == E->getCallee() &&
10234       !ArgChanged)
10235     return SemaRef.MaybeBindToTemporary(E);
10236
10237   // FIXME: Wrong source location information for the '('.
10238   SourceLocation FakeLParenLoc
10239     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10240   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10241                                       Args,
10242                                       E->getRParenLoc(), EC.get());
10243 }
10244
10245 template<typename Derived>
10246 ExprResult
10247 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10248   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10249   if (!Type)
10250     return ExprError();
10251
10252   ExprResult SubExpr
10253     = getDerived().TransformExpr(E->getSubExprAsWritten());
10254   if (SubExpr.isInvalid())
10255     return ExprError();
10256
10257   if (!getDerived().AlwaysRebuild() &&
10258       Type == E->getTypeInfoAsWritten() &&
10259       SubExpr.get() == E->getSubExpr())
10260     return E;
10261   return getDerived().RebuildCXXNamedCastExpr(
10262       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10263       Type, E->getAngleBrackets().getEnd(),
10264       // FIXME. this should be '(' location
10265       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10266 }
10267
10268 template<typename Derived>
10269 ExprResult
10270 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
10271   TypeSourceInfo *TSI =
10272       getDerived().TransformType(BCE->getTypeInfoAsWritten());
10273   if (!TSI)
10274     return ExprError();
10275
10276   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
10277   if (Sub.isInvalid())
10278     return ExprError();
10279
10280   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
10281                                                 Sub.get(), BCE->getEndLoc());
10282 }
10283
10284 template<typename Derived>
10285 ExprResult
10286 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10287   return getDerived().TransformCXXNamedCastExpr(E);
10288 }
10289
10290 template<typename Derived>
10291 ExprResult
10292 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10293   return getDerived().TransformCXXNamedCastExpr(E);
10294 }
10295
10296 template<typename Derived>
10297 ExprResult
10298 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10299                                                       CXXReinterpretCastExpr *E) {
10300   return getDerived().TransformCXXNamedCastExpr(E);
10301 }
10302
10303 template<typename Derived>
10304 ExprResult
10305 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10306   return getDerived().TransformCXXNamedCastExpr(E);
10307 }
10308
10309 template<typename Derived>
10310 ExprResult
10311 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10312                                                      CXXFunctionalCastExpr *E) {
10313   TypeSourceInfo *Type =
10314       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10315   if (!Type)
10316     return ExprError();
10317
10318   ExprResult SubExpr
10319     = getDerived().TransformExpr(E->getSubExprAsWritten());
10320   if (SubExpr.isInvalid())
10321     return ExprError();
10322
10323   if (!getDerived().AlwaysRebuild() &&
10324       Type == E->getTypeInfoAsWritten() &&
10325       SubExpr.get() == E->getSubExpr())
10326     return E;
10327
10328   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10329                                                    E->getLParenLoc(),
10330                                                    SubExpr.get(),
10331                                                    E->getRParenLoc(),
10332                                                    E->isListInitialization());
10333 }
10334
10335 template<typename Derived>
10336 ExprResult
10337 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10338   if (E->isTypeOperand()) {
10339     TypeSourceInfo *TInfo
10340       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10341     if (!TInfo)
10342       return ExprError();
10343
10344     if (!getDerived().AlwaysRebuild() &&
10345         TInfo == E->getTypeOperandSourceInfo())
10346       return E;
10347
10348     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10349                                              TInfo, E->getEndLoc());
10350   }
10351
10352   // We don't know whether the subexpression is potentially evaluated until
10353   // after we perform semantic analysis.  We speculatively assume it is
10354   // unevaluated; it will get fixed later if the subexpression is in fact
10355   // potentially evaluated.
10356   EnterExpressionEvaluationContext Unevaluated(
10357       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10358       Sema::ReuseLambdaContextDecl);
10359
10360   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10361   if (SubExpr.isInvalid())
10362     return ExprError();
10363
10364   if (!getDerived().AlwaysRebuild() &&
10365       SubExpr.get() == E->getExprOperand())
10366     return E;
10367
10368   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10369                                            SubExpr.get(), E->getEndLoc());
10370 }
10371
10372 template<typename Derived>
10373 ExprResult
10374 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10375   if (E->isTypeOperand()) {
10376     TypeSourceInfo *TInfo
10377       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10378     if (!TInfo)
10379       return ExprError();
10380
10381     if (!getDerived().AlwaysRebuild() &&
10382         TInfo == E->getTypeOperandSourceInfo())
10383       return E;
10384
10385     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10386                                              TInfo, E->getEndLoc());
10387   }
10388
10389   EnterExpressionEvaluationContext Unevaluated(
10390       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10391
10392   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10393   if (SubExpr.isInvalid())
10394     return ExprError();
10395
10396   if (!getDerived().AlwaysRebuild() &&
10397       SubExpr.get() == E->getExprOperand())
10398     return E;
10399
10400   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10401                                            SubExpr.get(), E->getEndLoc());
10402 }
10403
10404 template<typename Derived>
10405 ExprResult
10406 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10407   return E;
10408 }
10409
10410 template<typename Derived>
10411 ExprResult
10412 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10413                                                      CXXNullPtrLiteralExpr *E) {
10414   return E;
10415 }
10416
10417 template<typename Derived>
10418 ExprResult
10419 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10420   QualType T = getSema().getCurrentThisType();
10421
10422   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10423     // Mark it referenced in the new context regardless.
10424     // FIXME: this is a bit instantiation-specific.
10425     getSema().MarkThisReferenced(E);
10426     return E;
10427   }
10428
10429   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10430 }
10431
10432 template<typename Derived>
10433 ExprResult
10434 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10435   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10436   if (SubExpr.isInvalid())
10437     return ExprError();
10438
10439   if (!getDerived().AlwaysRebuild() &&
10440       SubExpr.get() == E->getSubExpr())
10441     return E;
10442
10443   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10444                                           E->isThrownVariableInScope());
10445 }
10446
10447 template<typename Derived>
10448 ExprResult
10449 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10450   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10451       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10452   if (!Param)
10453     return ExprError();
10454
10455   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
10456       E->getUsedContext() == SemaRef.CurContext)
10457     return E;
10458
10459   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10460 }
10461
10462 template<typename Derived>
10463 ExprResult
10464 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10465   FieldDecl *Field = cast_or_null<FieldDecl>(
10466       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10467   if (!Field)
10468     return ExprError();
10469
10470   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
10471       E->getUsedContext() == SemaRef.CurContext)
10472     return E;
10473
10474   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10475 }
10476
10477 template<typename Derived>
10478 ExprResult
10479 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10480                                                     CXXScalarValueInitExpr *E) {
10481   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10482   if (!T)
10483     return ExprError();
10484
10485   if (!getDerived().AlwaysRebuild() &&
10486       T == E->getTypeSourceInfo())
10487     return E;
10488
10489   return getDerived().RebuildCXXScalarValueInitExpr(T,
10490                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10491                                                     E->getRParenLoc());
10492 }
10493
10494 template<typename Derived>
10495 ExprResult
10496 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10497   // Transform the type that we're allocating
10498   TypeSourceInfo *AllocTypeInfo =
10499       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10500   if (!AllocTypeInfo)
10501     return ExprError();
10502
10503   // Transform the size of the array we're allocating (if any).
10504   Optional<Expr *> ArraySize;
10505   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
10506     ExprResult NewArraySize;
10507     if (*OldArraySize) {
10508       NewArraySize = getDerived().TransformExpr(*OldArraySize);
10509       if (NewArraySize.isInvalid())
10510         return ExprError();
10511     }
10512     ArraySize = NewArraySize.get();
10513   }
10514
10515   // Transform the placement arguments (if any).
10516   bool ArgumentChanged = false;
10517   SmallVector<Expr*, 8> PlacementArgs;
10518   if (getDerived().TransformExprs(E->getPlacementArgs(),
10519                                   E->getNumPlacementArgs(), true,
10520                                   PlacementArgs, &ArgumentChanged))
10521     return ExprError();
10522
10523   // Transform the initializer (if any).
10524   Expr *OldInit = E->getInitializer();
10525   ExprResult NewInit;
10526   if (OldInit)
10527     NewInit = getDerived().TransformInitializer(OldInit, true);
10528   if (NewInit.isInvalid())
10529     return ExprError();
10530
10531   // Transform new operator and delete operator.
10532   FunctionDecl *OperatorNew = nullptr;
10533   if (E->getOperatorNew()) {
10534     OperatorNew = cast_or_null<FunctionDecl>(
10535         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10536     if (!OperatorNew)
10537       return ExprError();
10538   }
10539
10540   FunctionDecl *OperatorDelete = nullptr;
10541   if (E->getOperatorDelete()) {
10542     OperatorDelete = cast_or_null<FunctionDecl>(
10543         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10544     if (!OperatorDelete)
10545       return ExprError();
10546   }
10547
10548   if (!getDerived().AlwaysRebuild() &&
10549       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10550       ArraySize == E->getArraySize() &&
10551       NewInit.get() == OldInit &&
10552       OperatorNew == E->getOperatorNew() &&
10553       OperatorDelete == E->getOperatorDelete() &&
10554       !ArgumentChanged) {
10555     // Mark any declarations we need as referenced.
10556     // FIXME: instantiation-specific.
10557     if (OperatorNew)
10558       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10559     if (OperatorDelete)
10560       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10561
10562     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10563       QualType ElementType
10564         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10565       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10566         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10567         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10568           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10569         }
10570       }
10571     }
10572
10573     return E;
10574   }
10575
10576   QualType AllocType = AllocTypeInfo->getType();
10577   if (!ArraySize) {
10578     // If no array size was specified, but the new expression was
10579     // instantiated with an array type (e.g., "new T" where T is
10580     // instantiated with "int[4]"), extract the outer bound from the
10581     // array type as our array size. We do this with constant and
10582     // dependently-sized array types.
10583     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10584     if (!ArrayT) {
10585       // Do nothing
10586     } else if (const ConstantArrayType *ConsArrayT
10587                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10588       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10589                                          SemaRef.Context.getSizeType(),
10590                                          /*FIXME:*/ E->getBeginLoc());
10591       AllocType = ConsArrayT->getElementType();
10592     } else if (const DependentSizedArrayType *DepArrayT
10593                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10594       if (DepArrayT->getSizeExpr()) {
10595         ArraySize = DepArrayT->getSizeExpr();
10596         AllocType = DepArrayT->getElementType();
10597       }
10598     }
10599   }
10600
10601   return getDerived().RebuildCXXNewExpr(
10602       E->getBeginLoc(), E->isGlobalNew(),
10603       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10604       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10605       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
10606 }
10607
10608 template<typename Derived>
10609 ExprResult
10610 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10611   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10612   if (Operand.isInvalid())
10613     return ExprError();
10614
10615   // Transform the delete operator, if known.
10616   FunctionDecl *OperatorDelete = nullptr;
10617   if (E->getOperatorDelete()) {
10618     OperatorDelete = cast_or_null<FunctionDecl>(
10619         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10620     if (!OperatorDelete)
10621       return ExprError();
10622   }
10623
10624   if (!getDerived().AlwaysRebuild() &&
10625       Operand.get() == E->getArgument() &&
10626       OperatorDelete == E->getOperatorDelete()) {
10627     // Mark any declarations we need as referenced.
10628     // FIXME: instantiation-specific.
10629     if (OperatorDelete)
10630       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10631
10632     if (!E->getArgument()->isTypeDependent()) {
10633       QualType Destroyed = SemaRef.Context.getBaseElementType(
10634                                                          E->getDestroyedType());
10635       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10636         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10637         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10638                                        SemaRef.LookupDestructor(Record));
10639       }
10640     }
10641
10642     return E;
10643   }
10644
10645   return getDerived().RebuildCXXDeleteExpr(
10646       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10647 }
10648
10649 template<typename Derived>
10650 ExprResult
10651 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10652                                                      CXXPseudoDestructorExpr *E) {
10653   ExprResult Base = getDerived().TransformExpr(E->getBase());
10654   if (Base.isInvalid())
10655     return ExprError();
10656
10657   ParsedType ObjectTypePtr;
10658   bool MayBePseudoDestructor = false;
10659   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10660                                               E->getOperatorLoc(),
10661                                         E->isArrow()? tok::arrow : tok::period,
10662                                               ObjectTypePtr,
10663                                               MayBePseudoDestructor);
10664   if (Base.isInvalid())
10665     return ExprError();
10666
10667   QualType ObjectType = ObjectTypePtr.get();
10668   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10669   if (QualifierLoc) {
10670     QualifierLoc
10671       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10672     if (!QualifierLoc)
10673       return ExprError();
10674   }
10675   CXXScopeSpec SS;
10676   SS.Adopt(QualifierLoc);
10677
10678   PseudoDestructorTypeStorage Destroyed;
10679   if (E->getDestroyedTypeInfo()) {
10680     TypeSourceInfo *DestroyedTypeInfo
10681       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10682                                                 ObjectType, nullptr, SS);
10683     if (!DestroyedTypeInfo)
10684       return ExprError();
10685     Destroyed = DestroyedTypeInfo;
10686   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10687     // We aren't likely to be able to resolve the identifier down to a type
10688     // now anyway, so just retain the identifier.
10689     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10690                                             E->getDestroyedTypeLoc());
10691   } else {
10692     // Look for a destructor known with the given name.
10693     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10694                                               *E->getDestroyedTypeIdentifier(),
10695                                                 E->getDestroyedTypeLoc(),
10696                                                 /*Scope=*/nullptr,
10697                                                 SS, ObjectTypePtr,
10698                                                 false);
10699     if (!T)
10700       return ExprError();
10701
10702     Destroyed
10703       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10704                                                  E->getDestroyedTypeLoc());
10705   }
10706
10707   TypeSourceInfo *ScopeTypeInfo = nullptr;
10708   if (E->getScopeTypeInfo()) {
10709     CXXScopeSpec EmptySS;
10710     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10711                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10712     if (!ScopeTypeInfo)
10713       return ExprError();
10714   }
10715
10716   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10717                                                      E->getOperatorLoc(),
10718                                                      E->isArrow(),
10719                                                      SS,
10720                                                      ScopeTypeInfo,
10721                                                      E->getColonColonLoc(),
10722                                                      E->getTildeLoc(),
10723                                                      Destroyed);
10724 }
10725
10726 template <typename Derived>
10727 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10728                                                         bool RequiresADL,
10729                                                         LookupResult &R) {
10730   // Transform all the decls.
10731   bool AllEmptyPacks = true;
10732   for (auto *OldD : Old->decls()) {
10733     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10734     if (!InstD) {
10735       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10736       // This can happen because of dependent hiding.
10737       if (isa<UsingShadowDecl>(OldD))
10738         continue;
10739       else {
10740         R.clear();
10741         return true;
10742       }
10743     }
10744
10745     // Expand using pack declarations.
10746     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10747     ArrayRef<NamedDecl*> Decls = SingleDecl;
10748     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10749       Decls = UPD->expansions();
10750
10751     // Expand using declarations.
10752     for (auto *D : Decls) {
10753       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10754         for (auto *SD : UD->shadows())
10755           R.addDecl(SD);
10756       } else {
10757         R.addDecl(D);
10758       }
10759     }
10760
10761     AllEmptyPacks &= Decls.empty();
10762   };
10763
10764   // C++ [temp.res]/8.4.2:
10765   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10766   //   a name in the template definition found a using-declaration, but the
10767   //   lookup in the corresponding scope in the instantiation odoes not find
10768   //   any declarations because the using-declaration was a pack expansion and
10769   //   the corresponding pack is empty
10770   if (AllEmptyPacks && !RequiresADL) {
10771     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10772         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
10773     return true;
10774   }
10775
10776   // Resolve a kind, but don't do any further analysis.  If it's
10777   // ambiguous, the callee needs to deal with it.
10778   R.resolveKind();
10779   return false;
10780 }
10781
10782 template<typename Derived>
10783 ExprResult
10784 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10785                                                   UnresolvedLookupExpr *Old) {
10786   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10787                  Sema::LookupOrdinaryName);
10788
10789   // Transform the declaration set.
10790   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10791     return ExprError();
10792
10793   // Rebuild the nested-name qualifier, if present.
10794   CXXScopeSpec SS;
10795   if (Old->getQualifierLoc()) {
10796     NestedNameSpecifierLoc QualifierLoc
10797       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10798     if (!QualifierLoc)
10799       return ExprError();
10800
10801     SS.Adopt(QualifierLoc);
10802   }
10803
10804   if (Old->getNamingClass()) {
10805     CXXRecordDecl *NamingClass
10806       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10807                                                             Old->getNameLoc(),
10808                                                         Old->getNamingClass()));
10809     if (!NamingClass) {
10810       R.clear();
10811       return ExprError();
10812     }
10813
10814     R.setNamingClass(NamingClass);
10815   }
10816
10817   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10818
10819   // If we have neither explicit template arguments, nor the template keyword,
10820   // it's a normal declaration name or member reference.
10821   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10822     NamedDecl *D = R.getAsSingle<NamedDecl>();
10823     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10824     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10825     // give a good diagnostic.
10826     if (D && D->isCXXInstanceMember()) {
10827       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10828                                                      /*TemplateArgs=*/nullptr,
10829                                                      /*Scope=*/nullptr);
10830     }
10831
10832     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10833   }
10834
10835   // If we have template arguments, rebuild them, then rebuild the
10836   // templateid expression.
10837   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10838   if (Old->hasExplicitTemplateArgs() &&
10839       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10840                                               Old->getNumTemplateArgs(),
10841                                               TransArgs)) {
10842     R.clear();
10843     return ExprError();
10844   }
10845
10846   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10847                                             Old->requiresADL(), &TransArgs);
10848 }
10849
10850 template<typename Derived>
10851 ExprResult
10852 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10853   bool ArgChanged = false;
10854   SmallVector<TypeSourceInfo *, 4> Args;
10855   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10856     TypeSourceInfo *From = E->getArg(I);
10857     TypeLoc FromTL = From->getTypeLoc();
10858     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10859       TypeLocBuilder TLB;
10860       TLB.reserve(FromTL.getFullDataSize());
10861       QualType To = getDerived().TransformType(TLB, FromTL);
10862       if (To.isNull())
10863         return ExprError();
10864
10865       if (To == From->getType())
10866         Args.push_back(From);
10867       else {
10868         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10869         ArgChanged = true;
10870       }
10871       continue;
10872     }
10873
10874     ArgChanged = true;
10875
10876     // We have a pack expansion. Instantiate it.
10877     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10878     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10879     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10880     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10881
10882     // Determine whether the set of unexpanded parameter packs can and should
10883     // be expanded.
10884     bool Expand = true;
10885     bool RetainExpansion = false;
10886     Optional<unsigned> OrigNumExpansions =
10887         ExpansionTL.getTypePtr()->getNumExpansions();
10888     Optional<unsigned> NumExpansions = OrigNumExpansions;
10889     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10890                                              PatternTL.getSourceRange(),
10891                                              Unexpanded,
10892                                              Expand, RetainExpansion,
10893                                              NumExpansions))
10894       return ExprError();
10895
10896     if (!Expand) {
10897       // The transform has determined that we should perform a simple
10898       // transformation on the pack expansion, producing another pack
10899       // expansion.
10900       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10901
10902       TypeLocBuilder TLB;
10903       TLB.reserve(From->getTypeLoc().getFullDataSize());
10904
10905       QualType To = getDerived().TransformType(TLB, PatternTL);
10906       if (To.isNull())
10907         return ExprError();
10908
10909       To = getDerived().RebuildPackExpansionType(To,
10910                                                  PatternTL.getSourceRange(),
10911                                                  ExpansionTL.getEllipsisLoc(),
10912                                                  NumExpansions);
10913       if (To.isNull())
10914         return ExprError();
10915
10916       PackExpansionTypeLoc ToExpansionTL
10917         = TLB.push<PackExpansionTypeLoc>(To);
10918       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10919       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10920       continue;
10921     }
10922
10923     // Expand the pack expansion by substituting for each argument in the
10924     // pack(s).
10925     for (unsigned I = 0; I != *NumExpansions; ++I) {
10926       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10927       TypeLocBuilder TLB;
10928       TLB.reserve(PatternTL.getFullDataSize());
10929       QualType To = getDerived().TransformType(TLB, PatternTL);
10930       if (To.isNull())
10931         return ExprError();
10932
10933       if (To->containsUnexpandedParameterPack()) {
10934         To = getDerived().RebuildPackExpansionType(To,
10935                                                    PatternTL.getSourceRange(),
10936                                                    ExpansionTL.getEllipsisLoc(),
10937                                                    NumExpansions);
10938         if (To.isNull())
10939           return ExprError();
10940
10941         PackExpansionTypeLoc ToExpansionTL
10942           = TLB.push<PackExpansionTypeLoc>(To);
10943         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10944       }
10945
10946       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10947     }
10948
10949     if (!RetainExpansion)
10950       continue;
10951
10952     // If we're supposed to retain a pack expansion, do so by temporarily
10953     // forgetting the partially-substituted parameter pack.
10954     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10955
10956     TypeLocBuilder TLB;
10957     TLB.reserve(From->getTypeLoc().getFullDataSize());
10958
10959     QualType To = getDerived().TransformType(TLB, PatternTL);
10960     if (To.isNull())
10961       return ExprError();
10962
10963     To = getDerived().RebuildPackExpansionType(To,
10964                                                PatternTL.getSourceRange(),
10965                                                ExpansionTL.getEllipsisLoc(),
10966                                                NumExpansions);
10967     if (To.isNull())
10968       return ExprError();
10969
10970     PackExpansionTypeLoc ToExpansionTL
10971       = TLB.push<PackExpansionTypeLoc>(To);
10972     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10973     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10974   }
10975
10976   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10977     return E;
10978
10979   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
10980                                        E->getEndLoc());
10981 }
10982
10983 template<typename Derived>
10984 ExprResult
10985 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10986   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10987   if (!T)
10988     return ExprError();
10989
10990   if (!getDerived().AlwaysRebuild() &&
10991       T == E->getQueriedTypeSourceInfo())
10992     return E;
10993
10994   ExprResult SubExpr;
10995   {
10996     EnterExpressionEvaluationContext Unevaluated(
10997         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10998     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10999     if (SubExpr.isInvalid())
11000       return ExprError();
11001
11002     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
11003       return E;
11004   }
11005
11006   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
11007                                             SubExpr.get(), E->getEndLoc());
11008 }
11009
11010 template<typename Derived>
11011 ExprResult
11012 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
11013   ExprResult SubExpr;
11014   {
11015     EnterExpressionEvaluationContext Unevaluated(
11016         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11017     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
11018     if (SubExpr.isInvalid())
11019       return ExprError();
11020
11021     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
11022       return E;
11023   }
11024
11025   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
11026                                              SubExpr.get(), E->getEndLoc());
11027 }
11028
11029 template <typename Derived>
11030 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
11031     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
11032     TypeSourceInfo **RecoveryTSI) {
11033   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
11034       DRE, AddrTaken, RecoveryTSI);
11035
11036   // Propagate both errors and recovered types, which return ExprEmpty.
11037   if (!NewDRE.isUsable())
11038     return NewDRE;
11039
11040   // We got an expr, wrap it up in parens.
11041   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
11042     return PE;
11043   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
11044                                        PE->getRParen());
11045 }
11046
11047 template <typename Derived>
11048 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11049     DependentScopeDeclRefExpr *E) {
11050   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
11051                                             nullptr);
11052 }
11053
11054 template<typename Derived>
11055 ExprResult
11056 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
11057                                                DependentScopeDeclRefExpr *E,
11058                                                bool IsAddressOfOperand,
11059                                                TypeSourceInfo **RecoveryTSI) {
11060   assert(E->getQualifierLoc());
11061   NestedNameSpecifierLoc QualifierLoc
11062   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11063   if (!QualifierLoc)
11064     return ExprError();
11065   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11066
11067   // TODO: If this is a conversion-function-id, verify that the
11068   // destination type name (if present) resolves the same way after
11069   // instantiation as it did in the local scope.
11070
11071   DeclarationNameInfo NameInfo
11072     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
11073   if (!NameInfo.getName())
11074     return ExprError();
11075
11076   if (!E->hasExplicitTemplateArgs()) {
11077     if (!getDerived().AlwaysRebuild() &&
11078         QualifierLoc == E->getQualifierLoc() &&
11079         // Note: it is sufficient to compare the Name component of NameInfo:
11080         // if name has not changed, DNLoc has not changed either.
11081         NameInfo.getName() == E->getDeclName())
11082       return E;
11083
11084     return getDerived().RebuildDependentScopeDeclRefExpr(
11085         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
11086         IsAddressOfOperand, RecoveryTSI);
11087   }
11088
11089   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11090   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11091                                               E->getNumTemplateArgs(),
11092                                               TransArgs))
11093     return ExprError();
11094
11095   return getDerived().RebuildDependentScopeDeclRefExpr(
11096       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
11097       RecoveryTSI);
11098 }
11099
11100 template<typename Derived>
11101 ExprResult
11102 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
11103   // CXXConstructExprs other than for list-initialization and
11104   // CXXTemporaryObjectExpr are always implicit, so when we have
11105   // a 1-argument construction we just transform that argument.
11106   if ((E->getNumArgs() == 1 ||
11107        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
11108       (!getDerived().DropCallArgument(E->getArg(0))) &&
11109       !E->isListInitialization())
11110     return getDerived().TransformExpr(E->getArg(0));
11111
11112   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
11113
11114   QualType T = getDerived().TransformType(E->getType());
11115   if (T.isNull())
11116     return ExprError();
11117
11118   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11119       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11120   if (!Constructor)
11121     return ExprError();
11122
11123   bool ArgumentChanged = false;
11124   SmallVector<Expr*, 8> Args;
11125   {
11126     EnterExpressionEvaluationContext Context(
11127         getSema(), EnterExpressionEvaluationContext::InitList,
11128         E->isListInitialization());
11129     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11130                                     &ArgumentChanged))
11131       return ExprError();
11132   }
11133
11134   if (!getDerived().AlwaysRebuild() &&
11135       T == E->getType() &&
11136       Constructor == E->getConstructor() &&
11137       !ArgumentChanged) {
11138     // Mark the constructor as referenced.
11139     // FIXME: Instantiation-specific
11140     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11141     return E;
11142   }
11143
11144   return getDerived().RebuildCXXConstructExpr(
11145       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
11146       E->hadMultipleCandidates(), E->isListInitialization(),
11147       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
11148       E->getConstructionKind(), E->getParenOrBraceRange());
11149 }
11150
11151 template<typename Derived>
11152 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
11153     CXXInheritedCtorInitExpr *E) {
11154   QualType T = getDerived().TransformType(E->getType());
11155   if (T.isNull())
11156     return ExprError();
11157
11158   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11159       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11160   if (!Constructor)
11161     return ExprError();
11162
11163   if (!getDerived().AlwaysRebuild() &&
11164       T == E->getType() &&
11165       Constructor == E->getConstructor()) {
11166     // Mark the constructor as referenced.
11167     // FIXME: Instantiation-specific
11168     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11169     return E;
11170   }
11171
11172   return getDerived().RebuildCXXInheritedCtorInitExpr(
11173       T, E->getLocation(), Constructor,
11174       E->constructsVBase(), E->inheritedFromVBase());
11175 }
11176
11177 /// Transform a C++ temporary-binding expression.
11178 ///
11179 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11180 /// transform the subexpression and return that.
11181 template<typename Derived>
11182 ExprResult
11183 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11184   return getDerived().TransformExpr(E->getSubExpr());
11185 }
11186
11187 /// Transform a C++ expression that contains cleanups that should
11188 /// be run after the expression is evaluated.
11189 ///
11190 /// Since ExprWithCleanups nodes are implicitly generated, we
11191 /// just transform the subexpression and return that.
11192 template<typename Derived>
11193 ExprResult
11194 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11195   return getDerived().TransformExpr(E->getSubExpr());
11196 }
11197
11198 template<typename Derived>
11199 ExprResult
11200 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11201                                                     CXXTemporaryObjectExpr *E) {
11202   TypeSourceInfo *T =
11203       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11204   if (!T)
11205     return ExprError();
11206
11207   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11208       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11209   if (!Constructor)
11210     return ExprError();
11211
11212   bool ArgumentChanged = false;
11213   SmallVector<Expr*, 8> Args;
11214   Args.reserve(E->getNumArgs());
11215   {
11216     EnterExpressionEvaluationContext Context(
11217         getSema(), EnterExpressionEvaluationContext::InitList,
11218         E->isListInitialization());
11219     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11220                        &ArgumentChanged))
11221       return ExprError();
11222   }
11223
11224   if (!getDerived().AlwaysRebuild() &&
11225       T == E->getTypeSourceInfo() &&
11226       Constructor == E->getConstructor() &&
11227       !ArgumentChanged) {
11228     // FIXME: Instantiation-specific
11229     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11230     return SemaRef.MaybeBindToTemporary(E);
11231   }
11232
11233   // FIXME: We should just pass E->isListInitialization(), but we're not
11234   // prepared to handle list-initialization without a child InitListExpr.
11235   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11236   return getDerived().RebuildCXXTemporaryObjectExpr(
11237       T, LParenLoc, Args, E->getEndLoc(),
11238       /*ListInitialization=*/LParenLoc.isInvalid());
11239 }
11240
11241 template<typename Derived>
11242 ExprResult
11243 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11244   // Transform any init-capture expressions before entering the scope of the
11245   // lambda body, because they are not semantically within that scope.
11246   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11247   struct TransformedInitCapture {
11248     // The location of the ... if the result is retaining a pack expansion.
11249     SourceLocation EllipsisLoc;
11250     // Zero or more expansions of the init-capture.
11251     SmallVector<InitCaptureInfoTy, 4> Expansions;
11252   };
11253   SmallVector<TransformedInitCapture, 4> InitCaptures;
11254   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
11255   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11256                                     CEnd = E->capture_end();
11257        C != CEnd; ++C) {
11258     if (!E->isInitCapture(C))
11259       continue;
11260
11261     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
11262     VarDecl *OldVD = C->getCapturedVar();
11263
11264     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
11265                                 Optional<unsigned> NumExpansions) {
11266       ExprResult NewExprInitResult = getDerived().TransformInitializer(
11267           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
11268
11269       if (NewExprInitResult.isInvalid()) {
11270         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
11271         return;
11272       }
11273       Expr *NewExprInit = NewExprInitResult.get();
11274
11275       QualType NewInitCaptureType =
11276           getSema().buildLambdaInitCaptureInitialization(
11277               C->getLocation(), OldVD->getType()->isReferenceType(),
11278               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
11279               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
11280               NewExprInit);
11281       Result.Expansions.push_back(
11282           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
11283     };
11284
11285     // If this is an init-capture pack, consider expanding the pack now.
11286     if (OldVD->isParameterPack()) {
11287       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
11288                                              ->getTypeLoc()
11289                                              .castAs<PackExpansionTypeLoc>();
11290       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11291       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
11292
11293       // Determine whether the set of unexpanded parameter packs can and should
11294       // be expanded.
11295       bool Expand = true;
11296       bool RetainExpansion = false;
11297       Optional<unsigned> OrigNumExpansions =
11298           ExpansionTL.getTypePtr()->getNumExpansions();
11299       Optional<unsigned> NumExpansions = OrigNumExpansions;
11300       if (getDerived().TryExpandParameterPacks(
11301               ExpansionTL.getEllipsisLoc(),
11302               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
11303               RetainExpansion, NumExpansions))
11304         return ExprError();
11305       if (Expand) {
11306         for (unsigned I = 0; I != *NumExpansions; ++I) {
11307           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11308           SubstInitCapture(SourceLocation(), None);
11309         }
11310       }
11311       if (!Expand || RetainExpansion) {
11312         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11313         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
11314         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
11315       }
11316     } else {
11317       SubstInitCapture(SourceLocation(), None);
11318     }
11319   }
11320
11321   // Transform the template parameters, and add them to the current
11322   // instantiation scope. The null case is handled correctly.
11323   auto TPL = getDerived().TransformTemplateParameterList(
11324       E->getTemplateParameterList());
11325
11326   // Transform the type of the original lambda's call operator.
11327   // The transformation MUST be done in the CurrentInstantiationScope since
11328   // it introduces a mapping of the original to the newly created
11329   // transformed parameters.
11330   TypeSourceInfo *NewCallOpTSI = nullptr;
11331   {
11332     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11333     FunctionProtoTypeLoc OldCallOpFPTL =
11334         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11335
11336     TypeLocBuilder NewCallOpTLBuilder;
11337     SmallVector<QualType, 4> ExceptionStorage;
11338     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11339     QualType NewCallOpType = TransformFunctionProtoType(
11340         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11341         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11342           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11343                                               ExceptionStorage, Changed);
11344         });
11345     if (NewCallOpType.isNull())
11346       return ExprError();
11347     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11348                                                         NewCallOpType);
11349   }
11350
11351   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11352   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11353   LSI->GLTemplateParameterList = TPL;
11354
11355   // Create the local class that will describe the lambda.
11356   CXXRecordDecl *OldClass = E->getLambdaClass();
11357   CXXRecordDecl *Class
11358     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11359                                         NewCallOpTSI,
11360                                         /*KnownDependent=*/false,
11361                                         E->getCaptureDefault());
11362   getDerived().transformedLocalDecl(OldClass, {Class});
11363
11364   Optional<std::pair<unsigned, Decl*>> Mangling;
11365   if (getDerived().ReplacingOriginal())
11366     Mangling = std::make_pair(OldClass->getLambdaManglingNumber(),
11367                               OldClass->getLambdaContextDecl());
11368
11369   // Build the call operator.
11370   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11371       Class, E->getIntroducerRange(), NewCallOpTSI,
11372       E->getCallOperator()->getEndLoc(),
11373       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11374       E->getCallOperator()->getConstexprKind(), Mangling);
11375
11376   LSI->CallOperator = NewCallOperator;
11377
11378   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11379        I != NumParams; ++I) {
11380     auto *P = NewCallOperator->getParamDecl(I);
11381     if (P->hasUninstantiatedDefaultArg()) {
11382       EnterExpressionEvaluationContext Eval(
11383           getSema(),
11384           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11385       ExprResult R = getDerived().TransformExpr(
11386           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11387       P->setDefaultArg(R.get());
11388     }
11389   }
11390
11391   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11392   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
11393
11394   // Introduce the context of the call operator.
11395   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11396                                  /*NewThisContext*/false);
11397
11398   // Enter the scope of the lambda.
11399   getSema().buildLambdaScope(LSI, NewCallOperator,
11400                              E->getIntroducerRange(),
11401                              E->getCaptureDefault(),
11402                              E->getCaptureDefaultLoc(),
11403                              E->hasExplicitParameters(),
11404                              E->hasExplicitResultType(),
11405                              E->isMutable());
11406
11407   bool Invalid = false;
11408
11409   // Transform captures.
11410   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11411                                  CEnd = E->capture_end();
11412        C != CEnd; ++C) {
11413     // When we hit the first implicit capture, tell Sema that we've finished
11414     // the list of explicit captures.
11415     if (C->isImplicit())
11416       break;
11417
11418     // Capturing 'this' is trivial.
11419     if (C->capturesThis()) {
11420       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11421                                     /*BuildAndDiagnose*/ true, nullptr,
11422                                     C->getCaptureKind() == LCK_StarThis);
11423       continue;
11424     }
11425     // Captured expression will be recaptured during captured variables
11426     // rebuilding.
11427     if (C->capturesVLAType())
11428       continue;
11429
11430     // Rebuild init-captures, including the implied field declaration.
11431     if (E->isInitCapture(C)) {
11432       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
11433
11434       VarDecl *OldVD = C->getCapturedVar();
11435       llvm::SmallVector<Decl*, 4> NewVDs;
11436
11437       for (InitCaptureInfoTy &Info : NewC.Expansions) {
11438         ExprResult Init = Info.first;
11439         QualType InitQualType = Info.second;
11440         if (Init.isInvalid() || InitQualType.isNull()) {
11441           Invalid = true;
11442           break;
11443         }
11444         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11445             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
11446             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
11447         if (!NewVD) {
11448           Invalid = true;
11449           break;
11450         }
11451         NewVDs.push_back(NewVD);
11452         getSema().addInitCapture(LSI, NewVD);
11453       }
11454
11455       if (Invalid)
11456         break;
11457
11458       getDerived().transformedLocalDecl(OldVD, NewVDs);
11459       continue;
11460     }
11461
11462     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11463
11464     // Determine the capture kind for Sema.
11465     Sema::TryCaptureKind Kind
11466       = C->isImplicit()? Sema::TryCapture_Implicit
11467                        : C->getCaptureKind() == LCK_ByCopy
11468                            ? Sema::TryCapture_ExplicitByVal
11469                            : Sema::TryCapture_ExplicitByRef;
11470     SourceLocation EllipsisLoc;
11471     if (C->isPackExpansion()) {
11472       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11473       bool ShouldExpand = false;
11474       bool RetainExpansion = false;
11475       Optional<unsigned> NumExpansions;
11476       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11477                                                C->getLocation(),
11478                                                Unexpanded,
11479                                                ShouldExpand, RetainExpansion,
11480                                                NumExpansions)) {
11481         Invalid = true;
11482         continue;
11483       }
11484
11485       if (ShouldExpand) {
11486         // The transform has determined that we should perform an expansion;
11487         // transform and capture each of the arguments.
11488         // expansion of the pattern. Do so.
11489         VarDecl *Pack = C->getCapturedVar();
11490         for (unsigned I = 0; I != *NumExpansions; ++I) {
11491           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11492           VarDecl *CapturedVar
11493             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11494                                                                Pack));
11495           if (!CapturedVar) {
11496             Invalid = true;
11497             continue;
11498           }
11499
11500           // Capture the transformed variable.
11501           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11502         }
11503
11504         // FIXME: Retain a pack expansion if RetainExpansion is true.
11505
11506         continue;
11507       }
11508
11509       EllipsisLoc = C->getEllipsisLoc();
11510     }
11511
11512     // Transform the captured variable.
11513     VarDecl *CapturedVar
11514       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11515                                                          C->getCapturedVar()));
11516     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11517       Invalid = true;
11518       continue;
11519     }
11520
11521     // Capture the transformed variable.
11522     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11523                                  EllipsisLoc);
11524   }
11525   getSema().finishLambdaExplicitCaptures(LSI);
11526
11527   // FIXME: Sema's lambda-building mechanism expects us to push an expression
11528   // evaluation context even if we're not transforming the function body.
11529   getSema().PushExpressionEvaluationContext(
11530       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11531
11532   // Instantiate the body of the lambda expression.
11533   StmtResult Body =
11534       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
11535
11536   // ActOnLambda* will pop the function scope for us.
11537   FuncScopeCleanup.disable();
11538
11539   if (Body.isInvalid()) {
11540     SavedContext.pop();
11541     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
11542                                /*IsInstantiation=*/true);
11543     return ExprError();
11544   }
11545
11546   // Copy the LSI before ActOnFinishFunctionBody removes it.
11547   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11548   // the call operator.
11549   auto LSICopy = *LSI;
11550   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11551                                     /*IsInstantiation*/ true);
11552   SavedContext.pop();
11553
11554   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
11555                                    &LSICopy);
11556 }
11557
11558 template<typename Derived>
11559 StmtResult
11560 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
11561   return TransformStmt(S);
11562 }
11563
11564 template<typename Derived>
11565 StmtResult
11566 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
11567   // Transform captures.
11568   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11569                                  CEnd = E->capture_end();
11570        C != CEnd; ++C) {
11571     // When we hit the first implicit capture, tell Sema that we've finished
11572     // the list of explicit captures.
11573     if (!C->isImplicit())
11574       continue;
11575
11576     // Capturing 'this' is trivial.
11577     if (C->capturesThis()) {
11578       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11579                                     /*BuildAndDiagnose*/ true, nullptr,
11580                                     C->getCaptureKind() == LCK_StarThis);
11581       continue;
11582     }
11583     // Captured expression will be recaptured during captured variables
11584     // rebuilding.
11585     if (C->capturesVLAType())
11586       continue;
11587
11588     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11589     assert(!E->isInitCapture(C) && "implicit init-capture?");
11590
11591     // Transform the captured variable.
11592     VarDecl *CapturedVar = cast_or_null<VarDecl>(
11593         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
11594     if (!CapturedVar || CapturedVar->isInvalidDecl())
11595       return StmtError();
11596
11597     // Capture the transformed variable.
11598     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
11599   }
11600
11601   return S;
11602 }
11603
11604 template<typename Derived>
11605 ExprResult
11606 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11607                                                   CXXUnresolvedConstructExpr *E) {
11608   TypeSourceInfo *T =
11609       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11610   if (!T)
11611     return ExprError();
11612
11613   bool ArgumentChanged = false;
11614   SmallVector<Expr*, 8> Args;
11615   Args.reserve(E->arg_size());
11616   {
11617     EnterExpressionEvaluationContext Context(
11618         getSema(), EnterExpressionEvaluationContext::InitList,
11619         E->isListInitialization());
11620     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11621                                     &ArgumentChanged))
11622       return ExprError();
11623   }
11624
11625   if (!getDerived().AlwaysRebuild() &&
11626       T == E->getTypeSourceInfo() &&
11627       !ArgumentChanged)
11628     return E;
11629
11630   // FIXME: we're faking the locations of the commas
11631   return getDerived().RebuildCXXUnresolvedConstructExpr(
11632       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
11633 }
11634
11635 template<typename Derived>
11636 ExprResult
11637 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11638                                              CXXDependentScopeMemberExpr *E) {
11639   // Transform the base of the expression.
11640   ExprResult Base((Expr*) nullptr);
11641   Expr *OldBase;
11642   QualType BaseType;
11643   QualType ObjectType;
11644   if (!E->isImplicitAccess()) {
11645     OldBase = E->getBase();
11646     Base = getDerived().TransformExpr(OldBase);
11647     if (Base.isInvalid())
11648       return ExprError();
11649
11650     // Start the member reference and compute the object's type.
11651     ParsedType ObjectTy;
11652     bool MayBePseudoDestructor = false;
11653     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11654                                                 E->getOperatorLoc(),
11655                                       E->isArrow()? tok::arrow : tok::period,
11656                                                 ObjectTy,
11657                                                 MayBePseudoDestructor);
11658     if (Base.isInvalid())
11659       return ExprError();
11660
11661     ObjectType = ObjectTy.get();
11662     BaseType = ((Expr*) Base.get())->getType();
11663   } else {
11664     OldBase = nullptr;
11665     BaseType = getDerived().TransformType(E->getBaseType());
11666     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11667   }
11668
11669   // Transform the first part of the nested-name-specifier that qualifies
11670   // the member name.
11671   NamedDecl *FirstQualifierInScope
11672     = getDerived().TransformFirstQualifierInScope(
11673                                             E->getFirstQualifierFoundInScope(),
11674                                             E->getQualifierLoc().getBeginLoc());
11675
11676   NestedNameSpecifierLoc QualifierLoc;
11677   if (E->getQualifier()) {
11678     QualifierLoc
11679       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11680                                                      ObjectType,
11681                                                      FirstQualifierInScope);
11682     if (!QualifierLoc)
11683       return ExprError();
11684   }
11685
11686   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11687
11688   // TODO: If this is a conversion-function-id, verify that the
11689   // destination type name (if present) resolves the same way after
11690   // instantiation as it did in the local scope.
11691
11692   DeclarationNameInfo NameInfo
11693     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11694   if (!NameInfo.getName())
11695     return ExprError();
11696
11697   if (!E->hasExplicitTemplateArgs()) {
11698     // This is a reference to a member without an explicitly-specified
11699     // template argument list. Optimize for this common case.
11700     if (!getDerived().AlwaysRebuild() &&
11701         Base.get() == OldBase &&
11702         BaseType == E->getBaseType() &&
11703         QualifierLoc == E->getQualifierLoc() &&
11704         NameInfo.getName() == E->getMember() &&
11705         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11706       return E;
11707
11708     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11709                                                        BaseType,
11710                                                        E->isArrow(),
11711                                                        E->getOperatorLoc(),
11712                                                        QualifierLoc,
11713                                                        TemplateKWLoc,
11714                                                        FirstQualifierInScope,
11715                                                        NameInfo,
11716                                                        /*TemplateArgs*/nullptr);
11717   }
11718
11719   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11720   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11721                                               E->getNumTemplateArgs(),
11722                                               TransArgs))
11723     return ExprError();
11724
11725   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11726                                                      BaseType,
11727                                                      E->isArrow(),
11728                                                      E->getOperatorLoc(),
11729                                                      QualifierLoc,
11730                                                      TemplateKWLoc,
11731                                                      FirstQualifierInScope,
11732                                                      NameInfo,
11733                                                      &TransArgs);
11734 }
11735
11736 template<typename Derived>
11737 ExprResult
11738 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11739   // Transform the base of the expression.
11740   ExprResult Base((Expr*) nullptr);
11741   QualType BaseType;
11742   if (!Old->isImplicitAccess()) {
11743     Base = getDerived().TransformExpr(Old->getBase());
11744     if (Base.isInvalid())
11745       return ExprError();
11746     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11747                                                      Old->isArrow());
11748     if (Base.isInvalid())
11749       return ExprError();
11750     BaseType = Base.get()->getType();
11751   } else {
11752     BaseType = getDerived().TransformType(Old->getBaseType());
11753   }
11754
11755   NestedNameSpecifierLoc QualifierLoc;
11756   if (Old->getQualifierLoc()) {
11757     QualifierLoc
11758     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11759     if (!QualifierLoc)
11760       return ExprError();
11761   }
11762
11763   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11764
11765   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11766                  Sema::LookupOrdinaryName);
11767
11768   // Transform the declaration set.
11769   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11770     return ExprError();
11771
11772   // Determine the naming class.
11773   if (Old->getNamingClass()) {
11774     CXXRecordDecl *NamingClass
11775       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11776                                                           Old->getMemberLoc(),
11777                                                         Old->getNamingClass()));
11778     if (!NamingClass)
11779       return ExprError();
11780
11781     R.setNamingClass(NamingClass);
11782   }
11783
11784   TemplateArgumentListInfo TransArgs;
11785   if (Old->hasExplicitTemplateArgs()) {
11786     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11787     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11788     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11789                                                 Old->getNumTemplateArgs(),
11790                                                 TransArgs))
11791       return ExprError();
11792   }
11793
11794   // FIXME: to do this check properly, we will need to preserve the
11795   // first-qualifier-in-scope here, just in case we had a dependent
11796   // base (and therefore couldn't do the check) and a
11797   // nested-name-qualifier (and therefore could do the lookup).
11798   NamedDecl *FirstQualifierInScope = nullptr;
11799
11800   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11801                                                   BaseType,
11802                                                   Old->getOperatorLoc(),
11803                                                   Old->isArrow(),
11804                                                   QualifierLoc,
11805                                                   TemplateKWLoc,
11806                                                   FirstQualifierInScope,
11807                                                   R,
11808                                               (Old->hasExplicitTemplateArgs()
11809                                                   ? &TransArgs : nullptr));
11810 }
11811
11812 template<typename Derived>
11813 ExprResult
11814 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11815   EnterExpressionEvaluationContext Unevaluated(
11816       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11817   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11818   if (SubExpr.isInvalid())
11819     return ExprError();
11820
11821   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11822     return E;
11823
11824   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11825 }
11826
11827 template<typename Derived>
11828 ExprResult
11829 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11830   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11831   if (Pattern.isInvalid())
11832     return ExprError();
11833
11834   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11835     return E;
11836
11837   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11838                                            E->getNumExpansions());
11839 }
11840
11841 template<typename Derived>
11842 ExprResult
11843 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11844   // If E is not value-dependent, then nothing will change when we transform it.
11845   // Note: This is an instantiation-centric view.
11846   if (!E->isValueDependent())
11847     return E;
11848
11849   EnterExpressionEvaluationContext Unevaluated(
11850       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11851
11852   ArrayRef<TemplateArgument> PackArgs;
11853   TemplateArgument ArgStorage;
11854
11855   // Find the argument list to transform.
11856   if (E->isPartiallySubstituted()) {
11857     PackArgs = E->getPartialArguments();
11858   } else if (E->isValueDependent()) {
11859     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11860     bool ShouldExpand = false;
11861     bool RetainExpansion = false;
11862     Optional<unsigned> NumExpansions;
11863     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11864                                              Unexpanded,
11865                                              ShouldExpand, RetainExpansion,
11866                                              NumExpansions))
11867       return ExprError();
11868
11869     // If we need to expand the pack, build a template argument from it and
11870     // expand that.
11871     if (ShouldExpand) {
11872       auto *Pack = E->getPack();
11873       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11874         ArgStorage = getSema().Context.getPackExpansionType(
11875             getSema().Context.getTypeDeclType(TTPD), None);
11876       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11877         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11878       } else {
11879         auto *VD = cast<ValueDecl>(Pack);
11880         ExprResult DRE = getSema().BuildDeclRefExpr(
11881             VD, VD->getType().getNonLValueExprType(getSema().Context),
11882             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
11883             E->getPackLoc());
11884         if (DRE.isInvalid())
11885           return ExprError();
11886         ArgStorage = new (getSema().Context) PackExpansionExpr(
11887             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11888       }
11889       PackArgs = ArgStorage;
11890     }
11891   }
11892
11893   // If we're not expanding the pack, just transform the decl.
11894   if (!PackArgs.size()) {
11895     auto *Pack = cast_or_null<NamedDecl>(
11896         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11897     if (!Pack)
11898       return ExprError();
11899     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11900                                               E->getPackLoc(),
11901                                               E->getRParenLoc(), None, None);
11902   }
11903
11904   // Try to compute the result without performing a partial substitution.
11905   Optional<unsigned> Result = 0;
11906   for (const TemplateArgument &Arg : PackArgs) {
11907     if (!Arg.isPackExpansion()) {
11908       Result = *Result + 1;
11909       continue;
11910     }
11911
11912     TemplateArgumentLoc ArgLoc;
11913     InventTemplateArgumentLoc(Arg, ArgLoc);
11914
11915     // Find the pattern of the pack expansion.
11916     SourceLocation Ellipsis;
11917     Optional<unsigned> OrigNumExpansions;
11918     TemplateArgumentLoc Pattern =
11919         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11920                                                           OrigNumExpansions);
11921
11922     // Substitute under the pack expansion. Do not expand the pack (yet).
11923     TemplateArgumentLoc OutPattern;
11924     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11925     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11926                                                /*Uneval*/ true))
11927       return true;
11928
11929     // See if we can determine the number of arguments from the result.
11930     Optional<unsigned> NumExpansions =
11931         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11932     if (!NumExpansions) {
11933       // No: we must be in an alias template expansion, and we're going to need
11934       // to actually expand the packs.
11935       Result = None;
11936       break;
11937     }
11938
11939     Result = *Result + *NumExpansions;
11940   }
11941
11942   // Common case: we could determine the number of expansions without
11943   // substituting.
11944   if (Result)
11945     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11946                                               E->getPackLoc(),
11947                                               E->getRParenLoc(), *Result, None);
11948
11949   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11950                                                E->getPackLoc());
11951   {
11952     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11953     typedef TemplateArgumentLocInventIterator<
11954         Derived, const TemplateArgument*> PackLocIterator;
11955     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11956                                    PackLocIterator(*this, PackArgs.end()),
11957                                    TransformedPackArgs, /*Uneval*/true))
11958       return ExprError();
11959   }
11960
11961   // Check whether we managed to fully-expand the pack.
11962   // FIXME: Is it possible for us to do so and not hit the early exit path?
11963   SmallVector<TemplateArgument, 8> Args;
11964   bool PartialSubstitution = false;
11965   for (auto &Loc : TransformedPackArgs.arguments()) {
11966     Args.push_back(Loc.getArgument());
11967     if (Loc.getArgument().isPackExpansion())
11968       PartialSubstitution = true;
11969   }
11970
11971   if (PartialSubstitution)
11972     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11973                                               E->getPackLoc(),
11974                                               E->getRParenLoc(), None, Args);
11975
11976   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11977                                             E->getPackLoc(), E->getRParenLoc(),
11978                                             Args.size(), None);
11979 }
11980
11981 template<typename Derived>
11982 ExprResult
11983 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11984                                           SubstNonTypeTemplateParmPackExpr *E) {
11985   // Default behavior is to do nothing with this transformation.
11986   return E;
11987 }
11988
11989 template<typename Derived>
11990 ExprResult
11991 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11992                                           SubstNonTypeTemplateParmExpr *E) {
11993   // Default behavior is to do nothing with this transformation.
11994   return E;
11995 }
11996
11997 template<typename Derived>
11998 ExprResult
11999 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
12000   // Default behavior is to do nothing with this transformation.
12001   return E;
12002 }
12003
12004 template<typename Derived>
12005 ExprResult
12006 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
12007                                                   MaterializeTemporaryExpr *E) {
12008   return getDerived().TransformExpr(E->GetTemporaryExpr());
12009 }
12010
12011 template<typename Derived>
12012 ExprResult
12013 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
12014   Expr *Pattern = E->getPattern();
12015
12016   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12017   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
12018   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12019
12020   // Determine whether the set of unexpanded parameter packs can and should
12021   // be expanded.
12022   bool Expand = true;
12023   bool RetainExpansion = false;
12024   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
12025                      NumExpansions = OrigNumExpansions;
12026   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
12027                                            Pattern->getSourceRange(),
12028                                            Unexpanded,
12029                                            Expand, RetainExpansion,
12030                                            NumExpansions))
12031     return true;
12032
12033   if (!Expand) {
12034     // Do not expand any packs here, just transform and rebuild a fold
12035     // expression.
12036     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12037
12038     ExprResult LHS =
12039         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
12040     if (LHS.isInvalid())
12041       return true;
12042
12043     ExprResult RHS =
12044         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
12045     if (RHS.isInvalid())
12046       return true;
12047
12048     if (!getDerived().AlwaysRebuild() &&
12049         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
12050       return E;
12051
12052     return getDerived().RebuildCXXFoldExpr(
12053         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
12054         RHS.get(), E->getEndLoc(), NumExpansions);
12055   }
12056
12057   // The transform has determined that we should perform an elementwise
12058   // expansion of the pattern. Do so.
12059   ExprResult Result = getDerived().TransformExpr(E->getInit());
12060   if (Result.isInvalid())
12061     return true;
12062   bool LeftFold = E->isLeftFold();
12063
12064   // If we're retaining an expansion for a right fold, it is the innermost
12065   // component and takes the init (if any).
12066   if (!LeftFold && RetainExpansion) {
12067     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12068
12069     ExprResult Out = getDerived().TransformExpr(Pattern);
12070     if (Out.isInvalid())
12071       return true;
12072
12073     Result = getDerived().RebuildCXXFoldExpr(
12074         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
12075         Result.get(), E->getEndLoc(), OrigNumExpansions);
12076     if (Result.isInvalid())
12077       return true;
12078   }
12079
12080   for (unsigned I = 0; I != *NumExpansions; ++I) {
12081     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
12082         getSema(), LeftFold ? I : *NumExpansions - I - 1);
12083     ExprResult Out = getDerived().TransformExpr(Pattern);
12084     if (Out.isInvalid())
12085       return true;
12086
12087     if (Out.get()->containsUnexpandedParameterPack()) {
12088       // We still have a pack; retain a pack expansion for this slice.
12089       Result = getDerived().RebuildCXXFoldExpr(
12090           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
12091           E->getOperator(), E->getEllipsisLoc(),
12092           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
12093           OrigNumExpansions);
12094     } else if (Result.isUsable()) {
12095       // We've got down to a single element; build a binary operator.
12096       Result = getDerived().RebuildBinaryOperator(
12097           E->getEllipsisLoc(), E->getOperator(),
12098           LeftFold ? Result.get() : Out.get(),
12099           LeftFold ? Out.get() : Result.get());
12100     } else
12101       Result = Out;
12102
12103     if (Result.isInvalid())
12104       return true;
12105   }
12106
12107   // If we're retaining an expansion for a left fold, it is the outermost
12108   // component and takes the complete expansion so far as its init (if any).
12109   if (LeftFold && RetainExpansion) {
12110     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12111
12112     ExprResult Out = getDerived().TransformExpr(Pattern);
12113     if (Out.isInvalid())
12114       return true;
12115
12116     Result = getDerived().RebuildCXXFoldExpr(
12117         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
12118         Out.get(), E->getEndLoc(), OrigNumExpansions);
12119     if (Result.isInvalid())
12120       return true;
12121   }
12122
12123   // If we had no init and an empty pack, and we're not retaining an expansion,
12124   // then produce a fallback value or error.
12125   if (Result.isUnset())
12126     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
12127                                                 E->getOperator());
12128
12129   return Result;
12130 }
12131
12132 template<typename Derived>
12133 ExprResult
12134 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
12135     CXXStdInitializerListExpr *E) {
12136   return getDerived().TransformExpr(E->getSubExpr());
12137 }
12138
12139 template<typename Derived>
12140 ExprResult
12141 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
12142   return SemaRef.MaybeBindToTemporary(E);
12143 }
12144
12145 template<typename Derived>
12146 ExprResult
12147 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
12148   return E;
12149 }
12150
12151 template<typename Derived>
12152 ExprResult
12153 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
12154   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12155   if (SubExpr.isInvalid())
12156     return ExprError();
12157
12158   if (!getDerived().AlwaysRebuild() &&
12159       SubExpr.get() == E->getSubExpr())
12160     return E;
12161
12162   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
12163 }
12164
12165 template<typename Derived>
12166 ExprResult
12167 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
12168   // Transform each of the elements.
12169   SmallVector<Expr *, 8> Elements;
12170   bool ArgChanged = false;
12171   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
12172                                   /*IsCall=*/false, Elements, &ArgChanged))
12173     return ExprError();
12174
12175   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12176     return SemaRef.MaybeBindToTemporary(E);
12177
12178   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
12179                                               Elements.data(),
12180                                               Elements.size());
12181 }
12182
12183 template<typename Derived>
12184 ExprResult
12185 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
12186                                                     ObjCDictionaryLiteral *E) {
12187   // Transform each of the elements.
12188   SmallVector<ObjCDictionaryElement, 8> Elements;
12189   bool ArgChanged = false;
12190   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
12191     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
12192
12193     if (OrigElement.isPackExpansion()) {
12194       // This key/value element is a pack expansion.
12195       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12196       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
12197       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
12198       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
12199
12200       // Determine whether the set of unexpanded parameter packs can
12201       // and should be expanded.
12202       bool Expand = true;
12203       bool RetainExpansion = false;
12204       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
12205       Optional<unsigned> NumExpansions = OrigNumExpansions;
12206       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
12207                                OrigElement.Value->getEndLoc());
12208       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
12209                                                PatternRange, Unexpanded, Expand,
12210                                                RetainExpansion, NumExpansions))
12211         return ExprError();
12212
12213       if (!Expand) {
12214         // The transform has determined that we should perform a simple
12215         // transformation on the pack expansion, producing another pack
12216         // expansion.
12217         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12218         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12219         if (Key.isInvalid())
12220           return ExprError();
12221
12222         if (Key.get() != OrigElement.Key)
12223           ArgChanged = true;
12224
12225         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12226         if (Value.isInvalid())
12227           return ExprError();
12228
12229         if (Value.get() != OrigElement.Value)
12230           ArgChanged = true;
12231
12232         ObjCDictionaryElement Expansion = {
12233           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
12234         };
12235         Elements.push_back(Expansion);
12236         continue;
12237       }
12238
12239       // Record right away that the argument was changed.  This needs
12240       // to happen even if the array expands to nothing.
12241       ArgChanged = true;
12242
12243       // The transform has determined that we should perform an elementwise
12244       // expansion of the pattern. Do so.
12245       for (unsigned I = 0; I != *NumExpansions; ++I) {
12246         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12247         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12248         if (Key.isInvalid())
12249           return ExprError();
12250
12251         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
12252         if (Value.isInvalid())
12253           return ExprError();
12254
12255         ObjCDictionaryElement Element = {
12256           Key.get(), Value.get(), SourceLocation(), NumExpansions
12257         };
12258
12259         // If any unexpanded parameter packs remain, we still have a
12260         // pack expansion.
12261         // FIXME: Can this really happen?
12262         if (Key.get()->containsUnexpandedParameterPack() ||
12263             Value.get()->containsUnexpandedParameterPack())
12264           Element.EllipsisLoc = OrigElement.EllipsisLoc;
12265
12266         Elements.push_back(Element);
12267       }
12268
12269       // FIXME: Retain a pack expansion if RetainExpansion is true.
12270
12271       // We've finished with this pack expansion.
12272       continue;
12273     }
12274
12275     // Transform and check key.
12276     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12277     if (Key.isInvalid())
12278       return ExprError();
12279
12280     if (Key.get() != OrigElement.Key)
12281       ArgChanged = true;
12282
12283     // Transform and check value.
12284     ExprResult Value
12285       = getDerived().TransformExpr(OrigElement.Value);
12286     if (Value.isInvalid())
12287       return ExprError();
12288
12289     if (Value.get() != OrigElement.Value)
12290       ArgChanged = true;
12291
12292     ObjCDictionaryElement Element = {
12293       Key.get(), Value.get(), SourceLocation(), None
12294     };
12295     Elements.push_back(Element);
12296   }
12297
12298   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12299     return SemaRef.MaybeBindToTemporary(E);
12300
12301   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12302                                                    Elements);
12303 }
12304
12305 template<typename Derived>
12306 ExprResult
12307 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12308   TypeSourceInfo *EncodedTypeInfo
12309     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12310   if (!EncodedTypeInfo)
12311     return ExprError();
12312
12313   if (!getDerived().AlwaysRebuild() &&
12314       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12315     return E;
12316
12317   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12318                                             EncodedTypeInfo,
12319                                             E->getRParenLoc());
12320 }
12321
12322 template<typename Derived>
12323 ExprResult TreeTransform<Derived>::
12324 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12325   // This is a kind of implicit conversion, and it needs to get dropped
12326   // and recomputed for the same general reasons that ImplicitCastExprs
12327   // do, as well a more specific one: this expression is only valid when
12328   // it appears *immediately* as an argument expression.
12329   return getDerived().TransformExpr(E->getSubExpr());
12330 }
12331
12332 template<typename Derived>
12333 ExprResult TreeTransform<Derived>::
12334 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12335   TypeSourceInfo *TSInfo
12336     = getDerived().TransformType(E->getTypeInfoAsWritten());
12337   if (!TSInfo)
12338     return ExprError();
12339
12340   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12341   if (Result.isInvalid())
12342     return ExprError();
12343
12344   if (!getDerived().AlwaysRebuild() &&
12345       TSInfo == E->getTypeInfoAsWritten() &&
12346       Result.get() == E->getSubExpr())
12347     return E;
12348
12349   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12350                                       E->getBridgeKeywordLoc(), TSInfo,
12351                                       Result.get());
12352 }
12353
12354 template <typename Derived>
12355 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12356     ObjCAvailabilityCheckExpr *E) {
12357   return E;
12358 }
12359
12360 template<typename Derived>
12361 ExprResult
12362 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12363   // Transform arguments.
12364   bool ArgChanged = false;
12365   SmallVector<Expr*, 8> Args;
12366   Args.reserve(E->getNumArgs());
12367   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12368                                   &ArgChanged))
12369     return ExprError();
12370
12371   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12372     // Class message: transform the receiver type.
12373     TypeSourceInfo *ReceiverTypeInfo
12374       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12375     if (!ReceiverTypeInfo)
12376       return ExprError();
12377
12378     // If nothing changed, just retain the existing message send.
12379     if (!getDerived().AlwaysRebuild() &&
12380         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12381       return SemaRef.MaybeBindToTemporary(E);
12382
12383     // Build a new class message send.
12384     SmallVector<SourceLocation, 16> SelLocs;
12385     E->getSelectorLocs(SelLocs);
12386     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12387                                                E->getSelector(),
12388                                                SelLocs,
12389                                                E->getMethodDecl(),
12390                                                E->getLeftLoc(),
12391                                                Args,
12392                                                E->getRightLoc());
12393   }
12394   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12395            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12396     if (!E->getMethodDecl())
12397       return ExprError();
12398
12399     // Build a new class message send to 'super'.
12400     SmallVector<SourceLocation, 16> SelLocs;
12401     E->getSelectorLocs(SelLocs);
12402     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12403                                                E->getSelector(),
12404                                                SelLocs,
12405                                                E->getReceiverType(),
12406                                                E->getMethodDecl(),
12407                                                E->getLeftLoc(),
12408                                                Args,
12409                                                E->getRightLoc());
12410   }
12411
12412   // Instance message: transform the receiver
12413   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12414          "Only class and instance messages may be instantiated");
12415   ExprResult Receiver
12416     = getDerived().TransformExpr(E->getInstanceReceiver());
12417   if (Receiver.isInvalid())
12418     return ExprError();
12419
12420   // If nothing changed, just retain the existing message send.
12421   if (!getDerived().AlwaysRebuild() &&
12422       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12423     return SemaRef.MaybeBindToTemporary(E);
12424
12425   // Build a new instance message send.
12426   SmallVector<SourceLocation, 16> SelLocs;
12427   E->getSelectorLocs(SelLocs);
12428   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12429                                              E->getSelector(),
12430                                              SelLocs,
12431                                              E->getMethodDecl(),
12432                                              E->getLeftLoc(),
12433                                              Args,
12434                                              E->getRightLoc());
12435 }
12436
12437 template<typename Derived>
12438 ExprResult
12439 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12440   return E;
12441 }
12442
12443 template<typename Derived>
12444 ExprResult
12445 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12446   return E;
12447 }
12448
12449 template<typename Derived>
12450 ExprResult
12451 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12452   // Transform the base expression.
12453   ExprResult Base = getDerived().TransformExpr(E->getBase());
12454   if (Base.isInvalid())
12455     return ExprError();
12456
12457   // We don't need to transform the ivar; it will never change.
12458
12459   // If nothing changed, just retain the existing expression.
12460   if (!getDerived().AlwaysRebuild() &&
12461       Base.get() == E->getBase())
12462     return E;
12463
12464   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
12465                                              E->getLocation(),
12466                                              E->isArrow(), E->isFreeIvar());
12467 }
12468
12469 template<typename Derived>
12470 ExprResult
12471 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
12472   // 'super' and types never change. Property never changes. Just
12473   // retain the existing expression.
12474   if (!E->isObjectReceiver())
12475     return E;
12476
12477   // Transform the base expression.
12478   ExprResult Base = getDerived().TransformExpr(E->getBase());
12479   if (Base.isInvalid())
12480     return ExprError();
12481
12482   // We don't need to transform the property; it will never change.
12483
12484   // If nothing changed, just retain the existing expression.
12485   if (!getDerived().AlwaysRebuild() &&
12486       Base.get() == E->getBase())
12487     return E;
12488
12489   if (E->isExplicitProperty())
12490     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12491                                                    E->getExplicitProperty(),
12492                                                    E->getLocation());
12493
12494   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12495                                                  SemaRef.Context.PseudoObjectTy,
12496                                                  E->getImplicitPropertyGetter(),
12497                                                  E->getImplicitPropertySetter(),
12498                                                  E->getLocation());
12499 }
12500
12501 template<typename Derived>
12502 ExprResult
12503 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12504   // Transform the base expression.
12505   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12506   if (Base.isInvalid())
12507     return ExprError();
12508
12509   // Transform the key expression.
12510   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12511   if (Key.isInvalid())
12512     return ExprError();
12513
12514   // If nothing changed, just retain the existing expression.
12515   if (!getDerived().AlwaysRebuild() &&
12516       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12517     return E;
12518
12519   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12520                                                   Base.get(), Key.get(),
12521                                                   E->getAtIndexMethodDecl(),
12522                                                   E->setAtIndexMethodDecl());
12523 }
12524
12525 template<typename Derived>
12526 ExprResult
12527 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12528   // Transform the base expression.
12529   ExprResult Base = getDerived().TransformExpr(E->getBase());
12530   if (Base.isInvalid())
12531     return ExprError();
12532
12533   // If nothing changed, just retain the existing expression.
12534   if (!getDerived().AlwaysRebuild() &&
12535       Base.get() == E->getBase())
12536     return E;
12537
12538   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12539                                          E->getOpLoc(),
12540                                          E->isArrow());
12541 }
12542
12543 template<typename Derived>
12544 ExprResult
12545 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12546   bool ArgumentChanged = false;
12547   SmallVector<Expr*, 8> SubExprs;
12548   SubExprs.reserve(E->getNumSubExprs());
12549   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12550                                   SubExprs, &ArgumentChanged))
12551     return ExprError();
12552
12553   if (!getDerived().AlwaysRebuild() &&
12554       !ArgumentChanged)
12555     return E;
12556
12557   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12558                                                SubExprs,
12559                                                E->getRParenLoc());
12560 }
12561
12562 template<typename Derived>
12563 ExprResult
12564 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12565   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12566   if (SrcExpr.isInvalid())
12567     return ExprError();
12568
12569   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12570   if (!Type)
12571     return ExprError();
12572
12573   if (!getDerived().AlwaysRebuild() &&
12574       Type == E->getTypeSourceInfo() &&
12575       SrcExpr.get() == E->getSrcExpr())
12576     return E;
12577
12578   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12579                                                SrcExpr.get(), Type,
12580                                                E->getRParenLoc());
12581 }
12582
12583 template<typename Derived>
12584 ExprResult
12585 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12586   BlockDecl *oldBlock = E->getBlockDecl();
12587
12588   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12589   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12590
12591   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12592   blockScope->TheDecl->setBlockMissingReturnType(
12593                          oldBlock->blockMissingReturnType());
12594
12595   SmallVector<ParmVarDecl*, 4> params;
12596   SmallVector<QualType, 4> paramTypes;
12597
12598   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12599
12600   // Parameter substitution.
12601   Sema::ExtParameterInfoBuilder extParamInfos;
12602   if (getDerived().TransformFunctionTypeParams(
12603           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12604           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12605           extParamInfos)) {
12606     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12607     return ExprError();
12608   }
12609
12610   QualType exprResultType =
12611       getDerived().TransformType(exprFunctionType->getReturnType());
12612
12613   auto epi = exprFunctionType->getExtProtoInfo();
12614   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12615
12616   QualType functionType =
12617     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12618   blockScope->FunctionType = functionType;
12619
12620   // Set the parameters on the block decl.
12621   if (!params.empty())
12622     blockScope->TheDecl->setParams(params);
12623
12624   if (!oldBlock->blockMissingReturnType()) {
12625     blockScope->HasImplicitReturnType = false;
12626     blockScope->ReturnType = exprResultType;
12627   }
12628
12629   // Transform the body
12630   StmtResult body = getDerived().TransformStmt(E->getBody());
12631   if (body.isInvalid()) {
12632     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12633     return ExprError();
12634   }
12635
12636 #ifndef NDEBUG
12637   // In builds with assertions, make sure that we captured everything we
12638   // captured before.
12639   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12640     for (const auto &I : oldBlock->captures()) {
12641       VarDecl *oldCapture = I.getVariable();
12642
12643       // Ignore parameter packs.
12644       if (oldCapture->isParameterPack())
12645         continue;
12646
12647       VarDecl *newCapture =
12648         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12649                                                  oldCapture));
12650       assert(blockScope->CaptureMap.count(newCapture));
12651     }
12652     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12653   }
12654 #endif
12655
12656   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12657                                     /*Scope=*/nullptr);
12658 }
12659
12660 template<typename Derived>
12661 ExprResult
12662 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12663   llvm_unreachable("Cannot transform asType expressions yet");
12664 }
12665
12666 template<typename Derived>
12667 ExprResult
12668 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12669   QualType RetTy = getDerived().TransformType(E->getType());
12670   bool ArgumentChanged = false;
12671   SmallVector<Expr*, 8> SubExprs;
12672   SubExprs.reserve(E->getNumSubExprs());
12673   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12674                                   SubExprs, &ArgumentChanged))
12675     return ExprError();
12676
12677   if (!getDerived().AlwaysRebuild() &&
12678       !ArgumentChanged)
12679     return E;
12680
12681   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12682                                         RetTy, E->getOp(), E->getRParenLoc());
12683 }
12684
12685 //===----------------------------------------------------------------------===//
12686 // Type reconstruction
12687 //===----------------------------------------------------------------------===//
12688
12689 template<typename Derived>
12690 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12691                                                     SourceLocation Star) {
12692   return SemaRef.BuildPointerType(PointeeType, Star,
12693                                   getDerived().getBaseEntity());
12694 }
12695
12696 template<typename Derived>
12697 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12698                                                          SourceLocation Star) {
12699   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12700                                        getDerived().getBaseEntity());
12701 }
12702
12703 template<typename Derived>
12704 QualType
12705 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12706                                              bool WrittenAsLValue,
12707                                              SourceLocation Sigil) {
12708   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12709                                     Sigil, getDerived().getBaseEntity());
12710 }
12711
12712 template<typename Derived>
12713 QualType
12714 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12715                                                  QualType ClassType,
12716                                                  SourceLocation Sigil) {
12717   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12718                                         getDerived().getBaseEntity());
12719 }
12720
12721 template<typename Derived>
12722 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12723            const ObjCTypeParamDecl *Decl,
12724            SourceLocation ProtocolLAngleLoc,
12725            ArrayRef<ObjCProtocolDecl *> Protocols,
12726            ArrayRef<SourceLocation> ProtocolLocs,
12727            SourceLocation ProtocolRAngleLoc) {
12728   return SemaRef.BuildObjCTypeParamType(Decl,
12729                                         ProtocolLAngleLoc, Protocols,
12730                                         ProtocolLocs, ProtocolRAngleLoc,
12731                                         /*FailOnError=*/true);
12732 }
12733
12734 template<typename Derived>
12735 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12736            QualType BaseType,
12737            SourceLocation Loc,
12738            SourceLocation TypeArgsLAngleLoc,
12739            ArrayRef<TypeSourceInfo *> TypeArgs,
12740            SourceLocation TypeArgsRAngleLoc,
12741            SourceLocation ProtocolLAngleLoc,
12742            ArrayRef<ObjCProtocolDecl *> Protocols,
12743            ArrayRef<SourceLocation> ProtocolLocs,
12744            SourceLocation ProtocolRAngleLoc) {
12745   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12746                                      TypeArgs, TypeArgsRAngleLoc,
12747                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12748                                      ProtocolRAngleLoc,
12749                                      /*FailOnError=*/true);
12750 }
12751
12752 template<typename Derived>
12753 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12754            QualType PointeeType,
12755            SourceLocation Star) {
12756   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12757 }
12758
12759 template<typename Derived>
12760 QualType
12761 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12762                                          ArrayType::ArraySizeModifier SizeMod,
12763                                          const llvm::APInt *Size,
12764                                          Expr *SizeExpr,
12765                                          unsigned IndexTypeQuals,
12766                                          SourceRange BracketsRange) {
12767   if (SizeExpr || !Size)
12768     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12769                                   IndexTypeQuals, BracketsRange,
12770                                   getDerived().getBaseEntity());
12771
12772   QualType Types[] = {
12773     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12774     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12775     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12776   };
12777   const unsigned NumTypes = llvm::array_lengthof(Types);
12778   QualType SizeType;
12779   for (unsigned I = 0; I != NumTypes; ++I)
12780     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12781       SizeType = Types[I];
12782       break;
12783     }
12784
12785   // Note that we can return a VariableArrayType here in the case where
12786   // the element type was a dependent VariableArrayType.
12787   IntegerLiteral *ArraySize
12788       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12789                                /*FIXME*/BracketsRange.getBegin());
12790   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12791                                 IndexTypeQuals, BracketsRange,
12792                                 getDerived().getBaseEntity());
12793 }
12794
12795 template<typename Derived>
12796 QualType
12797 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12798                                                  ArrayType::ArraySizeModifier SizeMod,
12799                                                  const llvm::APInt &Size,
12800                                                  unsigned IndexTypeQuals,
12801                                                  SourceRange BracketsRange) {
12802   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12803                                         IndexTypeQuals, BracketsRange);
12804 }
12805
12806 template<typename Derived>
12807 QualType
12808 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12809                                           ArrayType::ArraySizeModifier SizeMod,
12810                                                  unsigned IndexTypeQuals,
12811                                                    SourceRange BracketsRange) {
12812   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12813                                        IndexTypeQuals, BracketsRange);
12814 }
12815
12816 template<typename Derived>
12817 QualType
12818 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12819                                           ArrayType::ArraySizeModifier SizeMod,
12820                                                  Expr *SizeExpr,
12821                                                  unsigned IndexTypeQuals,
12822                                                  SourceRange BracketsRange) {
12823   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12824                                        SizeExpr,
12825                                        IndexTypeQuals, BracketsRange);
12826 }
12827
12828 template<typename Derived>
12829 QualType
12830 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12831                                           ArrayType::ArraySizeModifier SizeMod,
12832                                                        Expr *SizeExpr,
12833                                                        unsigned IndexTypeQuals,
12834                                                    SourceRange BracketsRange) {
12835   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12836                                        SizeExpr,
12837                                        IndexTypeQuals, BracketsRange);
12838 }
12839
12840 template <typename Derived>
12841 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
12842     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
12843   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
12844                                           AttributeLoc);
12845 }
12846
12847 template <typename Derived>
12848 QualType
12849 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12850                                           unsigned NumElements,
12851                                           VectorType::VectorKind VecKind) {
12852   // FIXME: semantic checking!
12853   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12854 }
12855
12856 template <typename Derived>
12857 QualType TreeTransform<Derived>::RebuildDependentVectorType(
12858     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
12859     VectorType::VectorKind VecKind) {
12860   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
12861 }
12862
12863 template<typename Derived>
12864 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12865                                                       unsigned NumElements,
12866                                                  SourceLocation AttributeLoc) {
12867   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12868                           NumElements, true);
12869   IntegerLiteral *VectorSize
12870     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12871                              AttributeLoc);
12872   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12873 }
12874
12875 template<typename Derived>
12876 QualType
12877 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12878                                                            Expr *SizeExpr,
12879                                                   SourceLocation AttributeLoc) {
12880   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12881 }
12882
12883 template<typename Derived>
12884 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12885     QualType T,
12886     MutableArrayRef<QualType> ParamTypes,
12887     const FunctionProtoType::ExtProtoInfo &EPI) {
12888   return SemaRef.BuildFunctionType(T, ParamTypes,
12889                                    getDerived().getBaseLocation(),
12890                                    getDerived().getBaseEntity(),
12891                                    EPI);
12892 }
12893
12894 template<typename Derived>
12895 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12896   return SemaRef.Context.getFunctionNoProtoType(T);
12897 }
12898
12899 template<typename Derived>
12900 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12901                                                             Decl *D) {
12902   assert(D && "no decl found");
12903   if (D->isInvalidDecl()) return QualType();
12904
12905   // FIXME: Doesn't account for ObjCInterfaceDecl!
12906   TypeDecl *Ty;
12907   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12908     // A valid resolved using typename pack expansion decl can have multiple
12909     // UsingDecls, but they must each have exactly one type, and it must be
12910     // the same type in every case. But we must have at least one expansion!
12911     if (UPD->expansions().empty()) {
12912       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12913           << UPD->isCXXClassMember() << UPD;
12914       return QualType();
12915     }
12916
12917     // We might still have some unresolved types. Try to pick a resolved type
12918     // if we can. The final instantiation will check that the remaining
12919     // unresolved types instantiate to the type we pick.
12920     QualType FallbackT;
12921     QualType T;
12922     for (auto *E : UPD->expansions()) {
12923       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12924       if (ThisT.isNull())
12925         continue;
12926       else if (ThisT->getAs<UnresolvedUsingType>())
12927         FallbackT = ThisT;
12928       else if (T.isNull())
12929         T = ThisT;
12930       else
12931         assert(getSema().Context.hasSameType(ThisT, T) &&
12932                "mismatched resolved types in using pack expansion");
12933     }
12934     return T.isNull() ? FallbackT : T;
12935   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12936     assert(Using->hasTypename() &&
12937            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12938
12939     // A valid resolved using typename decl points to exactly one type decl.
12940     assert(++Using->shadow_begin() == Using->shadow_end());
12941     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12942   } else {
12943     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12944            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12945     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12946   }
12947
12948   return SemaRef.Context.getTypeDeclType(Ty);
12949 }
12950
12951 template<typename Derived>
12952 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12953                                                        SourceLocation Loc) {
12954   return SemaRef.BuildTypeofExprType(E, Loc);
12955 }
12956
12957 template<typename Derived>
12958 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12959   return SemaRef.Context.getTypeOfType(Underlying);
12960 }
12961
12962 template<typename Derived>
12963 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12964                                                      SourceLocation Loc) {
12965   return SemaRef.BuildDecltypeType(E, Loc);
12966 }
12967
12968 template<typename Derived>
12969 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12970                                             UnaryTransformType::UTTKind UKind,
12971                                             SourceLocation Loc) {
12972   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12973 }
12974
12975 template<typename Derived>
12976 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12977                                                       TemplateName Template,
12978                                              SourceLocation TemplateNameLoc,
12979                                      TemplateArgumentListInfo &TemplateArgs) {
12980   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12981 }
12982
12983 template<typename Derived>
12984 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12985                                                    SourceLocation KWLoc) {
12986   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12987 }
12988
12989 template<typename Derived>
12990 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12991                                                  SourceLocation KWLoc,
12992                                                  bool isReadPipe) {
12993   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12994                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12995 }
12996
12997 template<typename Derived>
12998 TemplateName
12999 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13000                                             bool TemplateKW,
13001                                             TemplateDecl *Template) {
13002   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
13003                                                   Template);
13004 }
13005
13006 template<typename Derived>
13007 TemplateName
13008 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13009                                             SourceLocation TemplateKWLoc,
13010                                             const IdentifierInfo &Name,
13011                                             SourceLocation NameLoc,
13012                                             QualType ObjectType,
13013                                             NamedDecl *FirstQualifierInScope,
13014                                             bool AllowInjectedClassName) {
13015   UnqualifiedId TemplateName;
13016   TemplateName.setIdentifier(&Name, NameLoc);
13017   Sema::TemplateTy Template;
13018   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13019                                        SS, TemplateKWLoc, TemplateName,
13020                                        ParsedType::make(ObjectType),
13021                                        /*EnteringContext=*/false,
13022                                        Template, AllowInjectedClassName);
13023   return Template.get();
13024 }
13025
13026 template<typename Derived>
13027 TemplateName
13028 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
13029                                             SourceLocation TemplateKWLoc,
13030                                             OverloadedOperatorKind Operator,
13031                                             SourceLocation NameLoc,
13032                                             QualType ObjectType,
13033                                             bool AllowInjectedClassName) {
13034   UnqualifiedId Name;
13035   // FIXME: Bogus location information.
13036   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
13037   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
13038   Sema::TemplateTy Template;
13039   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
13040                                        SS, TemplateKWLoc, Name,
13041                                        ParsedType::make(ObjectType),
13042                                        /*EnteringContext=*/false,
13043                                        Template, AllowInjectedClassName);
13044   return Template.get();
13045 }
13046
13047 template<typename Derived>
13048 ExprResult
13049 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
13050                                                    SourceLocation OpLoc,
13051                                                    Expr *OrigCallee,
13052                                                    Expr *First,
13053                                                    Expr *Second) {
13054   Expr *Callee = OrigCallee->IgnoreParenCasts();
13055   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
13056
13057   if (First->getObjectKind() == OK_ObjCProperty) {
13058     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13059     if (BinaryOperator::isAssignmentOp(Opc))
13060       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
13061                                                  First, Second);
13062     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
13063     if (Result.isInvalid())
13064       return ExprError();
13065     First = Result.get();
13066   }
13067
13068   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
13069     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
13070     if (Result.isInvalid())
13071       return ExprError();
13072     Second = Result.get();
13073   }
13074
13075   // Determine whether this should be a builtin operation.
13076   if (Op == OO_Subscript) {
13077     if (!First->getType()->isOverloadableType() &&
13078         !Second->getType()->isOverloadableType())
13079       return getSema().CreateBuiltinArraySubscriptExpr(
13080           First, Callee->getBeginLoc(), Second, OpLoc);
13081   } else if (Op == OO_Arrow) {
13082     // -> is never a builtin operation.
13083     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
13084   } else if (Second == nullptr || isPostIncDec) {
13085     if (!First->getType()->isOverloadableType() ||
13086         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
13087       // The argument is not of overloadable type, or this is an expression
13088       // of the form &Class::member, so try to create a built-in unary
13089       // operation.
13090       UnaryOperatorKind Opc
13091         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13092
13093       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
13094     }
13095   } else {
13096     if (!First->getType()->isOverloadableType() &&
13097         !Second->getType()->isOverloadableType()) {
13098       // Neither of the arguments is an overloadable type, so try to
13099       // create a built-in binary operation.
13100       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13101       ExprResult Result
13102         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
13103       if (Result.isInvalid())
13104         return ExprError();
13105
13106       return Result;
13107     }
13108   }
13109
13110   // Compute the transformed set of functions (and function templates) to be
13111   // used during overload resolution.
13112   UnresolvedSet<16> Functions;
13113   bool RequiresADL;
13114
13115   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13116     Functions.append(ULE->decls_begin(), ULE->decls_end());
13117     // If the overload could not be resolved in the template definition
13118     // (because we had a dependent argument), ADL is performed as part of
13119     // template instantiation.
13120     RequiresADL = ULE->requiresADL();
13121   } else {
13122     // If we've resolved this to a particular non-member function, just call
13123     // that function. If we resolved it to a member function,
13124     // CreateOverloaded* will find that function for us.
13125     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
13126     if (!isa<CXXMethodDecl>(ND))
13127       Functions.addDecl(ND);
13128     RequiresADL = false;
13129   }
13130
13131   // Add any functions found via argument-dependent lookup.
13132   Expr *Args[2] = { First, Second };
13133   unsigned NumArgs = 1 + (Second != nullptr);
13134
13135   // Create the overloaded operator invocation for unary operators.
13136   if (NumArgs == 1 || isPostIncDec) {
13137     UnaryOperatorKind Opc
13138       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
13139     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
13140                                            RequiresADL);
13141   }
13142
13143   if (Op == OO_Subscript) {
13144     SourceLocation LBrace;
13145     SourceLocation RBrace;
13146
13147     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
13148         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
13149         LBrace = SourceLocation::getFromRawEncoding(
13150                     NameLoc.CXXOperatorName.BeginOpNameLoc);
13151         RBrace = SourceLocation::getFromRawEncoding(
13152                     NameLoc.CXXOperatorName.EndOpNameLoc);
13153     } else {
13154       LBrace = Callee->getBeginLoc();
13155       RBrace = OpLoc;
13156     }
13157
13158     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
13159                                                       First, Second);
13160   }
13161
13162   // Create the overloaded operator invocation for binary operators.
13163   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
13164   ExprResult Result = SemaRef.CreateOverloadedBinOp(
13165       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
13166   if (Result.isInvalid())
13167     return ExprError();
13168
13169   return Result;
13170 }
13171
13172 template<typename Derived>
13173 ExprResult
13174 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
13175                                                      SourceLocation OperatorLoc,
13176                                                        bool isArrow,
13177                                                        CXXScopeSpec &SS,
13178                                                      TypeSourceInfo *ScopeType,
13179                                                        SourceLocation CCLoc,
13180                                                        SourceLocation TildeLoc,
13181                                         PseudoDestructorTypeStorage Destroyed) {
13182   QualType BaseType = Base->getType();
13183   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
13184       (!isArrow && !BaseType->getAs<RecordType>()) ||
13185       (isArrow && BaseType->getAs<PointerType>() &&
13186        !BaseType->getAs<PointerType>()->getPointeeType()
13187                                               ->template getAs<RecordType>())){
13188     // This pseudo-destructor expression is still a pseudo-destructor.
13189     return SemaRef.BuildPseudoDestructorExpr(
13190         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
13191         CCLoc, TildeLoc, Destroyed);
13192   }
13193
13194   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
13195   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
13196                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
13197   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
13198   NameInfo.setNamedTypeInfo(DestroyedType);
13199
13200   // The scope type is now known to be a valid nested name specifier
13201   // component. Tack it on to the end of the nested name specifier.
13202   if (ScopeType) {
13203     if (!ScopeType->getType()->getAs<TagType>()) {
13204       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
13205                      diag::err_expected_class_or_namespace)
13206           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
13207       return ExprError();
13208     }
13209     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
13210               CCLoc);
13211   }
13212
13213   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
13214   return getSema().BuildMemberReferenceExpr(Base, BaseType,
13215                                             OperatorLoc, isArrow,
13216                                             SS, TemplateKWLoc,
13217                                             /*FIXME: FirstQualifier*/ nullptr,
13218                                             NameInfo,
13219                                             /*TemplateArgs*/ nullptr,
13220                                             /*S*/nullptr);
13221 }
13222
13223 template<typename Derived>
13224 StmtResult
13225 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
13226   SourceLocation Loc = S->getBeginLoc();
13227   CapturedDecl *CD = S->getCapturedDecl();
13228   unsigned NumParams = CD->getNumParams();
13229   unsigned ContextParamPos = CD->getContextParamPosition();
13230   SmallVector<Sema::CapturedParamNameType, 4> Params;
13231   for (unsigned I = 0; I < NumParams; ++I) {
13232     if (I != ContextParamPos) {
13233       Params.push_back(
13234              std::make_pair(
13235                   CD->getParam(I)->getName(),
13236                   getDerived().TransformType(CD->getParam(I)->getType())));
13237     } else {
13238       Params.push_back(std::make_pair(StringRef(), QualType()));
13239     }
13240   }
13241   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
13242                                      S->getCapturedRegionKind(), Params);
13243   StmtResult Body;
13244   {
13245     Sema::CompoundScopeRAII CompoundScope(getSema());
13246     Body = getDerived().TransformStmt(S->getCapturedStmt());
13247   }
13248
13249   if (Body.isInvalid()) {
13250     getSema().ActOnCapturedRegionError();
13251     return StmtError();
13252   }
13253
13254   return getSema().ActOnCapturedRegionEnd(Body.get());
13255 }
13256
13257 } // end namespace clang
13258
13259 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H