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