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