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