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