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