1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===/
9 // This file implements a semantic tree transformation that takes a given
10 // AST and rebuilds it, possibly transforming some nodes in the process.
12 //===----------------------------------------------------------------------===/
13 #ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_SEMA_TREETRANSFORM_H
16 #include "clang/Sema/SemaInternal.h"
17 #include "clang/Sema/Lookup.h"
18 #include "clang/Sema/ParsedTemplate.h"
19 #include "clang/Sema/SemaDiagnostic.h"
20 #include "clang/Sema/ScopeInfo.h"
21 #include "clang/AST/Decl.h"
22 #include "clang/AST/DeclObjC.h"
23 #include "clang/AST/Expr.h"
24 #include "clang/AST/ExprCXX.h"
25 #include "clang/AST/ExprObjC.h"
26 #include "clang/AST/Stmt.h"
27 #include "clang/AST/StmtCXX.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/Sema/Ownership.h"
30 #include "clang/Sema/Designator.h"
31 #include "clang/Lex/Preprocessor.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "TypeLocBuilder.h"
39 /// \brief A semantic tree transformation that allows one to transform one
40 /// abstract syntax tree into another.
42 /// A new tree transformation is defined by creating a new subclass \c X of
43 /// \c TreeTransform<X> and then overriding certain operations to provide
44 /// behavior specific to that transformation. For example, template
45 /// instantiation is implemented as a tree transformation where the
46 /// transformation of TemplateTypeParmType nodes involves substituting the
47 /// template arguments for their corresponding template parameters; a similar
48 /// transformation is performed for non-type template parameters and
49 /// template template parameters.
51 /// This tree-transformation template uses static polymorphism to allow
52 /// subclasses to customize any of its operations. Thus, a subclass can
53 /// override any of the transformation or rebuild operators by providing an
54 /// operation with the same signature as the default implementation. The
55 /// overridding function should not be virtual.
57 /// Semantic tree transformations are split into two stages, either of which
58 /// can be replaced by a subclass. The "transform" step transforms an AST node
59 /// or the parts of an AST node using the various transformation functions,
60 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
61 /// node of the appropriate kind from the pieces. The default transformation
62 /// routines recursively transform the operands to composite AST nodes (e.g.,
63 /// the pointee type of a PointerType node) and, if any of those operand nodes
64 /// were changed by the transformation, invokes the rebuild operation to create
67 /// Subclasses can customize the transformation at various levels. The
68 /// most coarse-grained transformations involve replacing TransformType(),
69 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
70 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
71 /// new implementations.
73 /// For more fine-grained transformations, subclasses can replace any of the
74 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
75 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
76 /// replacing TransformTemplateTypeParmType() allows template instantiation
77 /// to substitute template arguments for their corresponding template
78 /// parameters. Additionally, subclasses can override the \c RebuildXXX
79 /// functions to control how AST nodes are rebuilt when their operands change.
80 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
81 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
82 /// be able to use more efficient rebuild steps.
84 /// There are a handful of other functions that can be overridden, allowing one
85 /// to avoid traversing nodes that don't need any transformation
86 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
87 /// operands have not changed (\c AlwaysRebuild()), and customize the
88 /// default locations and entity names used for type-checking
89 /// (\c getBaseLocation(), \c getBaseEntity()).
90 template<typename Derived
>
96 /// \brief Initializes a new tree transformer.
97 TreeTransform(Sema
&SemaRef
) : SemaRef(SemaRef
) { }
99 /// \brief Retrieves a reference to the derived class.
100 Derived
&getDerived() { return static_cast<Derived
&>(*this); }
102 /// \brief Retrieves a reference to the derived class.
103 const Derived
&getDerived() const {
104 return static_cast<const Derived
&>(*this);
107 static inline ExprResult
Owned(Expr
*E
) { return E
; }
108 static inline StmtResult
Owned(Stmt
*S
) { return S
; }
110 /// \brief Retrieves a reference to the semantic analysis object used for
111 /// this tree transform.
112 Sema
&getSema() const { return SemaRef
; }
114 /// \brief Whether the transformation should always rebuild AST nodes, even
115 /// if none of the children have changed.
117 /// Subclasses may override this function to specify when the transformation
118 /// should rebuild all AST nodes.
119 bool AlwaysRebuild() { return false; }
121 /// \brief Returns the location of the entity being transformed, if that
122 /// information was not available elsewhere in the AST.
124 /// By default, returns no source-location information. Subclasses can
125 /// provide an alternative implementation that provides better location
127 SourceLocation
getBaseLocation() { return SourceLocation(); }
129 /// \brief Returns the name of the entity being transformed, if that
130 /// information was not available elsewhere in the AST.
132 /// By default, returns an empty name. Subclasses can provide an alternative
133 /// implementation with a more precise name.
134 DeclarationName
getBaseEntity() { return DeclarationName(); }
136 /// \brief Sets the "base" location and entity when that
137 /// information is known based on another transformation.
139 /// By default, the source location and entity are ignored. Subclasses can
140 /// override this function to provide a customized implementation.
141 void setBase(SourceLocation Loc
, DeclarationName Entity
) { }
143 /// \brief RAII object that temporarily sets the base location and entity
144 /// used for reporting diagnostics in types.
145 class TemporaryBase
{
147 SourceLocation OldLocation
;
148 DeclarationName OldEntity
;
151 TemporaryBase(TreeTransform
&Self
, SourceLocation Location
,
152 DeclarationName Entity
) : Self(Self
) {
153 OldLocation
= Self
.getDerived().getBaseLocation();
154 OldEntity
= Self
.getDerived().getBaseEntity();
155 Self
.getDerived().setBase(Location
, Entity
);
159 Self
.getDerived().setBase(OldLocation
, OldEntity
);
163 /// \brief Determine whether the given type \p T has already been
166 /// Subclasses can provide an alternative implementation of this routine
167 /// to short-circuit evaluation when it is known that a given type will
168 /// not change. For example, template instantiation need not traverse
169 /// non-dependent types.
170 bool AlreadyTransformed(QualType T
) {
174 /// \brief Determine whether the given call argument should be dropped, e.g.,
175 /// because it is a default argument.
177 /// Subclasses can provide an alternative implementation of this routine to
178 /// determine which kinds of call arguments get dropped. By default,
179 /// CXXDefaultArgument nodes are dropped (prior to transformation).
180 bool DropCallArgument(Expr
*E
) {
181 return E
->isDefaultArgument();
184 /// \brief Determine whether we should expand a pack expansion with the
185 /// given set of parameter packs into separate arguments by repeatedly
186 /// transforming the pattern.
188 /// By default, the transformer never tries to expand pack expansions.
189 /// Subclasses can override this routine to provide different behavior.
191 /// \param EllipsisLoc The location of the ellipsis that identifies the
194 /// \param PatternRange The source range that covers the entire pattern of
195 /// the pack expansion.
197 /// \param Unexpanded The set of unexpanded parameter packs within the
200 /// \param NumUnexpanded The number of unexpanded parameter packs in
203 /// \param ShouldExpand Will be set to \c true if the transformer should
204 /// expand the corresponding pack expansions into separate arguments. When
205 /// set, \c NumExpansions must also be set.
207 /// \param NumExpansions The number of separate arguments that will be in
208 /// the expanded form of the corresponding pack expansion. Must be set when
209 /// \c ShouldExpand is \c true.
211 /// \returns true if an error occurred (e.g., because the parameter packs
212 /// are to be instantiated with arguments of different lengths), false
213 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
215 bool TryExpandParameterPacks(SourceLocation EllipsisLoc
,
216 SourceRange PatternRange
,
217 const UnexpandedParameterPack
*Unexpanded
,
218 unsigned NumUnexpanded
,
220 unsigned &NumExpansions
) {
221 ShouldExpand
= false;
225 /// \brief Transforms the given type into another type.
227 /// By default, this routine transforms a type by creating a
228 /// TypeSourceInfo for it and delegating to the appropriate
229 /// function. This is expensive, but we don't mind, because
230 /// this method is deprecated anyway; all users should be
231 /// switched to storing TypeSourceInfos.
233 /// \returns the transformed type.
234 QualType
TransformType(QualType T
);
236 /// \brief Transforms the given type-with-location into a new
237 /// type-with-location.
239 /// By default, this routine transforms a type by delegating to the
240 /// appropriate TransformXXXType to build a new type. Subclasses
241 /// may override this function (to take over all type
242 /// transformations) or some set of the TransformXXXType functions
243 /// to alter the transformation.
244 TypeSourceInfo
*TransformType(TypeSourceInfo
*DI
);
246 /// \brief Transform the given type-with-location into a new
247 /// type, collecting location information in the given builder
250 QualType
TransformType(TypeLocBuilder
&TLB
, TypeLoc TL
);
252 /// \brief Transform the given statement.
254 /// By default, this routine transforms a statement by delegating to the
255 /// appropriate TransformXXXStmt function to transform a specific kind of
256 /// statement or the TransformExpr() function to transform an expression.
257 /// Subclasses may override this function to transform statements using some
260 /// \returns the transformed statement.
261 StmtResult
TransformStmt(Stmt
*S
);
263 /// \brief Transform the given expression.
265 /// By default, this routine transforms an expression by delegating to the
266 /// appropriate TransformXXXExpr function to build a new expression.
267 /// Subclasses may override this function to transform expressions using some
270 /// \returns the transformed expression.
271 ExprResult
TransformExpr(Expr
*E
);
273 /// \brief Transform the given declaration, which is referenced from a type
276 /// By default, acts as the identity function on declarations. Subclasses
277 /// may override this function to provide alternate behavior.
278 Decl
*TransformDecl(SourceLocation Loc
, Decl
*D
) { return D
; }
280 /// \brief Transform the definition of the given declaration.
282 /// By default, invokes TransformDecl() to transform the declaration.
283 /// Subclasses may override this function to provide alternate behavior.
284 Decl
*TransformDefinition(SourceLocation Loc
, Decl
*D
) {
285 return getDerived().TransformDecl(Loc
, D
);
288 /// \brief Transform the given declaration, which was the first part of a
289 /// nested-name-specifier in a member access expression.
291 /// This specific declaration transformation only applies to the first
292 /// identifier in a nested-name-specifier of a member access expression, e.g.,
293 /// the \c T in \c x->T::member
295 /// By default, invokes TransformDecl() to transform the declaration.
296 /// Subclasses may override this function to provide alternate behavior.
297 NamedDecl
*TransformFirstQualifierInScope(NamedDecl
*D
, SourceLocation Loc
) {
298 return cast_or_null
<NamedDecl
>(getDerived().TransformDecl(Loc
, D
));
301 /// \brief Transform the given nested-name-specifier.
303 /// By default, transforms all of the types and declarations within the
304 /// nested-name-specifier. Subclasses may override this function to provide
305 /// alternate behavior.
306 NestedNameSpecifier
*TransformNestedNameSpecifier(NestedNameSpecifier
*NNS
,
308 QualType ObjectType
= QualType(),
309 NamedDecl
*FirstQualifierInScope
= 0);
311 /// \brief Transform the given declaration name.
313 /// By default, transforms the types of conversion function, constructor,
314 /// and destructor names and then (if needed) rebuilds the declaration name.
315 /// Identifiers and selectors are returned unmodified. Sublcasses may
316 /// override this function to provide alternate behavior.
318 TransformDeclarationNameInfo(const DeclarationNameInfo
&NameInfo
);
320 /// \brief Transform the given template name.
322 /// By default, transforms the template name by transforming the declarations
323 /// and nested-name-specifiers that occur within the template name.
324 /// Subclasses may override this function to provide alternate behavior.
325 TemplateName
TransformTemplateName(TemplateName Name
,
326 QualType ObjectType
= QualType(),
327 NamedDecl
*FirstQualifierInScope
= 0);
329 /// \brief Transform the given template argument.
331 /// By default, this operation transforms the type, expression, or
332 /// declaration stored within the template argument and constructs a
333 /// new template argument from the transformed result. Subclasses may
334 /// override this function to provide alternate behavior.
336 /// Returns true if there was an error.
337 bool TransformTemplateArgument(const TemplateArgumentLoc
&Input
,
338 TemplateArgumentLoc
&Output
);
340 /// \brief Transform the given set of template arguments.
342 /// By default, this operation transforms all of the template arguments
343 /// in the input set using \c TransformTemplateArgument(), and appends
344 /// the transformed arguments to the output list.
346 /// Note that this overload of \c TransformTemplateArguments() is merely
347 /// a convenience function. Subclasses that wish to override this behavior
348 /// should override the iterator-based member template version.
350 /// \param Inputs The set of template arguments to be transformed.
352 /// \param NumInputs The number of template arguments in \p Inputs.
354 /// \param Outputs The set of transformed template arguments output by this
357 /// Returns true if an error occurred.
358 bool TransformTemplateArguments(const TemplateArgumentLoc
*Inputs
,
360 TemplateArgumentListInfo
&Outputs
) {
361 return TransformTemplateArguments(Inputs
, Inputs
+ NumInputs
, Outputs
);
364 /// \brief Transform the given set of template arguments.
366 /// By default, this operation transforms all of the template arguments
367 /// in the input set using \c TransformTemplateArgument(), and appends
368 /// the transformed arguments to the output list.
370 /// \param First An iterator to the first template argument.
372 /// \param Last An iterator one step past the last template argument.
374 /// \param Outputs The set of transformed template arguments output by this
377 /// Returns true if an error occurred.
378 template<typename InputIterator
>
379 bool TransformTemplateArguments(InputIterator First
,
381 TemplateArgumentListInfo
&Outputs
);
383 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
384 void InventTemplateArgumentLoc(const TemplateArgument
&Arg
,
385 TemplateArgumentLoc
&ArgLoc
);
387 /// \brief Fakes up a TypeSourceInfo for a type.
388 TypeSourceInfo
*InventTypeSourceInfo(QualType T
) {
389 return SemaRef
.Context
.getTrivialTypeSourceInfo(T
,
390 getDerived().getBaseLocation());
393 #define ABSTRACT_TYPELOC(CLASS, PARENT)
394 #define TYPELOC(CLASS, PARENT) \
395 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
396 #include "clang/AST/TypeLocNodes.def"
399 TransformTemplateSpecializationType(TypeLocBuilder
&TLB
,
400 TemplateSpecializationTypeLoc TL
,
401 TemplateName Template
);
404 TransformDependentTemplateSpecializationType(TypeLocBuilder
&TLB
,
405 DependentTemplateSpecializationTypeLoc TL
,
406 NestedNameSpecifier
*Prefix
);
408 /// \brief Transforms the parameters of a function type into the
411 /// The result vectors should be kept in sync; null entries in the
412 /// variables vector are acceptable.
414 /// Return true on error.
415 bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL
,
416 llvm::SmallVectorImpl
<QualType
> &PTypes
,
417 llvm::SmallVectorImpl
<ParmVarDecl
*> &PVars
);
419 /// \brief Transforms a single function-type parameter. Return null
421 ParmVarDecl
*TransformFunctionTypeParam(ParmVarDecl
*OldParm
);
423 QualType
TransformReferenceType(TypeLocBuilder
&TLB
, ReferenceTypeLoc TL
);
425 StmtResult
TransformCompoundStmt(CompoundStmt
*S
, bool IsStmtExpr
);
426 ExprResult
TransformCXXNamedCastExpr(CXXNamedCastExpr
*E
);
428 #define STMT(Node, Parent) \
429 StmtResult Transform##Node(Node *S);
430 #define EXPR(Node, Parent) \
431 ExprResult Transform##Node(Node *E);
432 #define ABSTRACT_STMT(Stmt)
433 #include "clang/AST/StmtNodes.inc"
435 /// \brief Build a new pointer type given its pointee type.
437 /// By default, performs semantic analysis when building the pointer type.
438 /// Subclasses may override this routine to provide different behavior.
439 QualType
RebuildPointerType(QualType PointeeType
, SourceLocation Sigil
);
441 /// \brief Build a new block pointer type given its pointee type.
443 /// By default, performs semantic analysis when building the block pointer
444 /// type. Subclasses may override this routine to provide different behavior.
445 QualType
RebuildBlockPointerType(QualType PointeeType
, SourceLocation Sigil
);
447 /// \brief Build a new reference type given the type it references.
449 /// By default, performs semantic analysis when building the
450 /// reference type. Subclasses may override this routine to provide
451 /// different behavior.
453 /// \param LValue whether the type was written with an lvalue sigil
454 /// or an rvalue sigil.
455 QualType
RebuildReferenceType(QualType ReferentType
,
457 SourceLocation Sigil
);
459 /// \brief Build a new member pointer type given the pointee type and the
460 /// class type it refers into.
462 /// By default, performs semantic analysis when building the member pointer
463 /// type. Subclasses may override this routine to provide different behavior.
464 QualType
RebuildMemberPointerType(QualType PointeeType
, QualType ClassType
,
465 SourceLocation Sigil
);
467 /// \brief Build a new array type given the element type, size
468 /// modifier, size of the array (if known), size expression, and index type
471 /// By default, performs semantic analysis when building the array type.
472 /// Subclasses may override this routine to provide different behavior.
473 /// Also by default, all of the other Rebuild*Array
474 QualType
RebuildArrayType(QualType ElementType
,
475 ArrayType::ArraySizeModifier SizeMod
,
476 const llvm::APInt
*Size
,
478 unsigned IndexTypeQuals
,
479 SourceRange BracketsRange
);
481 /// \brief Build a new constant array type given the element type, size
482 /// modifier, (known) size of the array, and index type qualifiers.
484 /// By default, performs semantic analysis when building the array type.
485 /// Subclasses may override this routine to provide different behavior.
486 QualType
RebuildConstantArrayType(QualType ElementType
,
487 ArrayType::ArraySizeModifier SizeMod
,
488 const llvm::APInt
&Size
,
489 unsigned IndexTypeQuals
,
490 SourceRange BracketsRange
);
492 /// \brief Build a new incomplete array type given the element type, size
493 /// modifier, and index type qualifiers.
495 /// By default, performs semantic analysis when building the array type.
496 /// Subclasses may override this routine to provide different behavior.
497 QualType
RebuildIncompleteArrayType(QualType ElementType
,
498 ArrayType::ArraySizeModifier SizeMod
,
499 unsigned IndexTypeQuals
,
500 SourceRange BracketsRange
);
502 /// \brief Build a new variable-length array type given the element type,
503 /// size modifier, size expression, and index type qualifiers.
505 /// By default, performs semantic analysis when building the array type.
506 /// Subclasses may override this routine to provide different behavior.
507 QualType
RebuildVariableArrayType(QualType ElementType
,
508 ArrayType::ArraySizeModifier SizeMod
,
510 unsigned IndexTypeQuals
,
511 SourceRange BracketsRange
);
513 /// \brief Build a new dependent-sized array type given the element type,
514 /// size modifier, size expression, and index type qualifiers.
516 /// By default, performs semantic analysis when building the array type.
517 /// Subclasses may override this routine to provide different behavior.
518 QualType
RebuildDependentSizedArrayType(QualType ElementType
,
519 ArrayType::ArraySizeModifier SizeMod
,
521 unsigned IndexTypeQuals
,
522 SourceRange BracketsRange
);
524 /// \brief Build a new vector type given the element type and
525 /// number of elements.
527 /// By default, performs semantic analysis when building the vector type.
528 /// Subclasses may override this routine to provide different behavior.
529 QualType
RebuildVectorType(QualType ElementType
, unsigned NumElements
,
530 VectorType::VectorKind VecKind
);
532 /// \brief Build a new extended vector type given the element type and
533 /// number of elements.
535 /// By default, performs semantic analysis when building the vector type.
536 /// Subclasses may override this routine to provide different behavior.
537 QualType
RebuildExtVectorType(QualType ElementType
, unsigned NumElements
,
538 SourceLocation AttributeLoc
);
540 /// \brief Build a new potentially dependently-sized extended vector type
541 /// given the element type and number of elements.
543 /// By default, performs semantic analysis when building the vector type.
544 /// Subclasses may override this routine to provide different behavior.
545 QualType
RebuildDependentSizedExtVectorType(QualType ElementType
,
547 SourceLocation AttributeLoc
);
549 /// \brief Build a new function type.
551 /// By default, performs semantic analysis when building the function type.
552 /// Subclasses may override this routine to provide different behavior.
553 QualType
RebuildFunctionProtoType(QualType T
,
554 QualType
*ParamTypes
,
555 unsigned NumParamTypes
,
556 bool Variadic
, unsigned Quals
,
557 const FunctionType::ExtInfo
&Info
);
559 /// \brief Build a new unprototyped function type.
560 QualType
RebuildFunctionNoProtoType(QualType ResultType
);
562 /// \brief Rebuild an unresolved typename type, given the decl that
563 /// the UnresolvedUsingTypenameDecl was transformed to.
564 QualType
RebuildUnresolvedUsingType(Decl
*D
);
566 /// \brief Build a new typedef type.
567 QualType
RebuildTypedefType(TypedefDecl
*Typedef
) {
568 return SemaRef
.Context
.getTypeDeclType(Typedef
);
571 /// \brief Build a new class/struct/union type.
572 QualType
RebuildRecordType(RecordDecl
*Record
) {
573 return SemaRef
.Context
.getTypeDeclType(Record
);
576 /// \brief Build a new Enum type.
577 QualType
RebuildEnumType(EnumDecl
*Enum
) {
578 return SemaRef
.Context
.getTypeDeclType(Enum
);
581 /// \brief Build a new typeof(expr) type.
583 /// By default, performs semantic analysis when building the typeof type.
584 /// Subclasses may override this routine to provide different behavior.
585 QualType
RebuildTypeOfExprType(Expr
*Underlying
, SourceLocation Loc
);
587 /// \brief Build a new typeof(type) type.
589 /// By default, builds a new TypeOfType with the given underlying type.
590 QualType
RebuildTypeOfType(QualType Underlying
);
592 /// \brief Build a new C++0x decltype type.
594 /// By default, performs semantic analysis when building the decltype type.
595 /// Subclasses may override this routine to provide different behavior.
596 QualType
RebuildDecltypeType(Expr
*Underlying
, SourceLocation Loc
);
598 /// \brief Build a new template specialization type.
600 /// By default, performs semantic analysis when building the template
601 /// specialization type. Subclasses may override this routine to provide
602 /// different behavior.
603 QualType
RebuildTemplateSpecializationType(TemplateName Template
,
604 SourceLocation TemplateLoc
,
605 const TemplateArgumentListInfo
&Args
);
607 /// \brief Build a new parenthesized type.
609 /// By default, builds a new ParenType type from the inner type.
610 /// Subclasses may override this routine to provide different behavior.
611 QualType
RebuildParenType(QualType InnerType
) {
612 return SemaRef
.Context
.getParenType(InnerType
);
615 /// \brief Build a new qualified name type.
617 /// By default, builds a new ElaboratedType type from the keyword,
618 /// the nested-name-specifier and the named type.
619 /// Subclasses may override this routine to provide different behavior.
620 QualType
RebuildElaboratedType(SourceLocation KeywordLoc
,
621 ElaboratedTypeKeyword Keyword
,
622 NestedNameSpecifier
*NNS
, QualType Named
) {
623 return SemaRef
.Context
.getElaboratedType(Keyword
, NNS
, Named
);
626 /// \brief Build a new typename type that refers to a template-id.
628 /// By default, builds a new DependentNameType type from the
629 /// nested-name-specifier and the given type. Subclasses may override
630 /// this routine to provide different behavior.
631 QualType
RebuildDependentTemplateSpecializationType(
632 ElaboratedTypeKeyword Keyword
,
633 NestedNameSpecifier
*Qualifier
,
634 SourceRange QualifierRange
,
635 const IdentifierInfo
*Name
,
636 SourceLocation NameLoc
,
637 const TemplateArgumentListInfo
&Args
) {
638 // Rebuild the template name.
639 // TODO: avoid TemplateName abstraction
640 TemplateName InstName
=
641 getDerived().RebuildTemplateName(Qualifier
, QualifierRange
, *Name
,
644 if (InstName
.isNull())
647 // If it's still dependent, make a dependent specialization.
648 if (InstName
.getAsDependentTemplateName())
649 return SemaRef
.Context
.getDependentTemplateSpecializationType(
650 Keyword
, Qualifier
, Name
, Args
);
652 // Otherwise, make an elaborated type wrapping a non-dependent
655 getDerived().RebuildTemplateSpecializationType(InstName
, NameLoc
, Args
);
656 if (T
.isNull()) return QualType();
658 // NOTE: NNS is already recorded in template specialization type T.
659 return SemaRef
.Context
.getElaboratedType(Keyword
, /*NNS=*/0, T
);
662 /// \brief Build a new typename type that refers to an identifier.
664 /// By default, performs semantic analysis when building the typename type
665 /// (or elaborated type). Subclasses may override this routine to provide
666 /// different behavior.
667 QualType
RebuildDependentNameType(ElaboratedTypeKeyword Keyword
,
668 NestedNameSpecifier
*NNS
,
669 const IdentifierInfo
*Id
,
670 SourceLocation KeywordLoc
,
671 SourceRange NNSRange
,
672 SourceLocation IdLoc
) {
675 SS
.setRange(NNSRange
);
677 if (NNS
->isDependent()) {
678 // If the name is still dependent, just build a new dependent name type.
679 if (!SemaRef
.computeDeclContext(SS
))
680 return SemaRef
.Context
.getDependentNameType(Keyword
, NNS
, Id
);
683 if (Keyword
== ETK_None
|| Keyword
== ETK_Typename
)
684 return SemaRef
.CheckTypenameType(Keyword
, NNS
, *Id
,
685 KeywordLoc
, NNSRange
, IdLoc
);
687 TagTypeKind Kind
= TypeWithKeyword::getTagTypeKindForKeyword(Keyword
);
689 // We had a dependent elaborated-type-specifier that has been transformed
690 // into a non-dependent elaborated-type-specifier. Find the tag we're
692 LookupResult
Result(SemaRef
, Id
, IdLoc
, Sema::LookupTagName
);
693 DeclContext
*DC
= SemaRef
.computeDeclContext(SS
, false);
697 if (SemaRef
.RequireCompleteDeclContext(SS
, DC
))
701 SemaRef
.LookupQualifiedName(Result
, DC
);
702 switch (Result
.getResultKind()) {
703 case LookupResult::NotFound
:
704 case LookupResult::NotFoundInCurrentInstantiation
:
707 case LookupResult::Found
:
708 Tag
= Result
.getAsSingle
<TagDecl
>();
711 case LookupResult::FoundOverloaded
:
712 case LookupResult::FoundUnresolvedValue
:
713 llvm_unreachable("Tag lookup cannot find non-tags");
716 case LookupResult::Ambiguous
:
717 // Let the LookupResult structure handle ambiguities.
722 // FIXME: Would be nice to highlight just the source range.
723 SemaRef
.Diag(IdLoc
, diag::err_not_tag_in_scope
)
728 if (!SemaRef
.isAcceptableTagRedeclaration(Tag
, Kind
, IdLoc
, *Id
)) {
729 SemaRef
.Diag(KeywordLoc
, diag::err_use_with_wrong_tag
) << Id
;
730 SemaRef
.Diag(Tag
->getLocation(), diag::note_previous_use
);
734 // Build the elaborated-type-specifier type.
735 QualType T
= SemaRef
.Context
.getTypeDeclType(Tag
);
736 return SemaRef
.Context
.getElaboratedType(Keyword
, NNS
, T
);
739 /// \brief Build a new nested-name-specifier given the prefix and an
740 /// identifier that names the next step in the nested-name-specifier.
742 /// By default, performs semantic analysis when building the new
743 /// nested-name-specifier. Subclasses may override this routine to provide
744 /// different behavior.
745 NestedNameSpecifier
*RebuildNestedNameSpecifier(NestedNameSpecifier
*Prefix
,
749 NamedDecl
*FirstQualifierInScope
);
751 /// \brief Build a new nested-name-specifier given the prefix and the
752 /// namespace named in the next step in the nested-name-specifier.
754 /// By default, performs semantic analysis when building the new
755 /// nested-name-specifier. Subclasses may override this routine to provide
756 /// different behavior.
757 NestedNameSpecifier
*RebuildNestedNameSpecifier(NestedNameSpecifier
*Prefix
,
761 /// \brief Build a new nested-name-specifier given the prefix and the
762 /// type named in the next step in the nested-name-specifier.
764 /// By default, performs semantic analysis when building the new
765 /// nested-name-specifier. Subclasses may override this routine to provide
766 /// different behavior.
767 NestedNameSpecifier
*RebuildNestedNameSpecifier(NestedNameSpecifier
*Prefix
,
772 /// \brief Build a new template name given a nested name specifier, a flag
773 /// indicating whether the "template" keyword was provided, and the template
774 /// that the template name refers to.
776 /// By default, builds the new template name directly. Subclasses may override
777 /// this routine to provide different behavior.
778 TemplateName
RebuildTemplateName(NestedNameSpecifier
*Qualifier
,
780 TemplateDecl
*Template
);
782 /// \brief Build a new template name given a nested name specifier and the
783 /// name that is referred to as a template.
785 /// By default, performs semantic analysis to determine whether the name can
786 /// be resolved to a specific template, then builds the appropriate kind of
787 /// template name. Subclasses may override this routine to provide different
789 TemplateName
RebuildTemplateName(NestedNameSpecifier
*Qualifier
,
790 SourceRange QualifierRange
,
791 const IdentifierInfo
&II
,
793 NamedDecl
*FirstQualifierInScope
);
795 /// \brief Build a new template name given a nested name specifier and the
796 /// overloaded operator name that is referred to as a template.
798 /// By default, performs semantic analysis to determine whether the name can
799 /// be resolved to a specific template, then builds the appropriate kind of
800 /// template name. Subclasses may override this routine to provide different
802 TemplateName
RebuildTemplateName(NestedNameSpecifier
*Qualifier
,
803 OverloadedOperatorKind Operator
,
804 QualType ObjectType
);
806 /// \brief Build a new compound statement.
808 /// By default, performs semantic analysis to build the new statement.
809 /// Subclasses may override this routine to provide different behavior.
810 StmtResult
RebuildCompoundStmt(SourceLocation LBraceLoc
,
811 MultiStmtArg Statements
,
812 SourceLocation RBraceLoc
,
814 return getSema().ActOnCompoundStmt(LBraceLoc
, RBraceLoc
, Statements
,
818 /// \brief Build a new case statement.
820 /// By default, performs semantic analysis to build the new statement.
821 /// Subclasses may override this routine to provide different behavior.
822 StmtResult
RebuildCaseStmt(SourceLocation CaseLoc
,
824 SourceLocation EllipsisLoc
,
826 SourceLocation ColonLoc
) {
827 return getSema().ActOnCaseStmt(CaseLoc
, LHS
, EllipsisLoc
, RHS
,
831 /// \brief Attach the body to a new case statement.
833 /// By default, performs semantic analysis to build the new statement.
834 /// Subclasses may override this routine to provide different behavior.
835 StmtResult
RebuildCaseStmtBody(Stmt
*S
, Stmt
*Body
) {
836 getSema().ActOnCaseStmtBody(S
, Body
);
840 /// \brief Build a new default statement.
842 /// By default, performs semantic analysis to build the new statement.
843 /// Subclasses may override this routine to provide different behavior.
844 StmtResult
RebuildDefaultStmt(SourceLocation DefaultLoc
,
845 SourceLocation ColonLoc
,
847 return getSema().ActOnDefaultStmt(DefaultLoc
, ColonLoc
, SubStmt
,
851 /// \brief Build a new label statement.
853 /// By default, performs semantic analysis to build the new statement.
854 /// Subclasses may override this routine to provide different behavior.
855 StmtResult
RebuildLabelStmt(SourceLocation IdentLoc
,
857 SourceLocation ColonLoc
,
858 Stmt
*SubStmt
, bool HasUnusedAttr
) {
859 return SemaRef
.ActOnLabelStmt(IdentLoc
, Id
, ColonLoc
, SubStmt
,
863 /// \brief Build a new "if" statement.
865 /// By default, performs semantic analysis to build the new statement.
866 /// Subclasses may override this routine to provide different behavior.
867 StmtResult
RebuildIfStmt(SourceLocation IfLoc
, Sema::FullExprArg Cond
,
868 VarDecl
*CondVar
, Stmt
*Then
,
869 SourceLocation ElseLoc
, Stmt
*Else
) {
870 return getSema().ActOnIfStmt(IfLoc
, Cond
, CondVar
, Then
, ElseLoc
, Else
);
873 /// \brief Start building a new switch statement.
875 /// By default, performs semantic analysis to build the new statement.
876 /// Subclasses may override this routine to provide different behavior.
877 StmtResult
RebuildSwitchStmtStart(SourceLocation SwitchLoc
,
878 Expr
*Cond
, VarDecl
*CondVar
) {
879 return getSema().ActOnStartOfSwitchStmt(SwitchLoc
, Cond
,
883 /// \brief Attach the body to the switch statement.
885 /// By default, performs semantic analysis to build the new statement.
886 /// Subclasses may override this routine to provide different behavior.
887 StmtResult
RebuildSwitchStmtBody(SourceLocation SwitchLoc
,
888 Stmt
*Switch
, Stmt
*Body
) {
889 return getSema().ActOnFinishSwitchStmt(SwitchLoc
, Switch
, Body
);
892 /// \brief Build a new while statement.
894 /// By default, performs semantic analysis to build the new statement.
895 /// Subclasses may override this routine to provide different behavior.
896 StmtResult
RebuildWhileStmt(SourceLocation WhileLoc
,
897 Sema::FullExprArg Cond
,
900 return getSema().ActOnWhileStmt(WhileLoc
, Cond
, CondVar
, Body
);
903 /// \brief Build a new do-while statement.
905 /// By default, performs semantic analysis to build the new statement.
906 /// Subclasses may override this routine to provide different behavior.
907 StmtResult
RebuildDoStmt(SourceLocation DoLoc
, Stmt
*Body
,
908 SourceLocation WhileLoc
,
909 SourceLocation LParenLoc
,
911 SourceLocation RParenLoc
) {
912 return getSema().ActOnDoStmt(DoLoc
, Body
, WhileLoc
, LParenLoc
,
916 /// \brief Build a new for statement.
918 /// By default, performs semantic analysis to build the new statement.
919 /// Subclasses may override this routine to provide different behavior.
920 StmtResult
RebuildForStmt(SourceLocation ForLoc
,
921 SourceLocation LParenLoc
,
922 Stmt
*Init
, Sema::FullExprArg Cond
,
923 VarDecl
*CondVar
, Sema::FullExprArg Inc
,
924 SourceLocation RParenLoc
, Stmt
*Body
) {
925 return getSema().ActOnForStmt(ForLoc
, LParenLoc
, Init
, Cond
,
927 Inc
, RParenLoc
, Body
);
930 /// \brief Build a new goto statement.
932 /// By default, performs semantic analysis to build the new statement.
933 /// Subclasses may override this routine to provide different behavior.
934 StmtResult
RebuildGotoStmt(SourceLocation GotoLoc
,
935 SourceLocation LabelLoc
,
937 return getSema().ActOnGotoStmt(GotoLoc
, LabelLoc
, Label
->getID());
940 /// \brief Build a new indirect goto statement.
942 /// By default, performs semantic analysis to build the new statement.
943 /// Subclasses may override this routine to provide different behavior.
944 StmtResult
RebuildIndirectGotoStmt(SourceLocation GotoLoc
,
945 SourceLocation StarLoc
,
947 return getSema().ActOnIndirectGotoStmt(GotoLoc
, StarLoc
, Target
);
950 /// \brief Build a new return statement.
952 /// By default, performs semantic analysis to build the new statement.
953 /// Subclasses may override this routine to provide different behavior.
954 StmtResult
RebuildReturnStmt(SourceLocation ReturnLoc
,
957 return getSema().ActOnReturnStmt(ReturnLoc
, Result
);
960 /// \brief Build a new declaration statement.
962 /// By default, performs semantic analysis to build the new statement.
963 /// Subclasses may override this routine to provide different behavior.
964 StmtResult
RebuildDeclStmt(Decl
**Decls
, unsigned NumDecls
,
965 SourceLocation StartLoc
,
966 SourceLocation EndLoc
) {
967 return getSema().Owned(
968 new (getSema().Context
) DeclStmt(
969 DeclGroupRef::Create(getSema().Context
,
974 /// \brief Build a new inline asm statement.
976 /// By default, performs semantic analysis to build the new statement.
977 /// Subclasses may override this routine to provide different behavior.
978 StmtResult
RebuildAsmStmt(SourceLocation AsmLoc
,
983 IdentifierInfo
**Names
,
984 MultiExprArg Constraints
,
987 MultiExprArg Clobbers
,
988 SourceLocation RParenLoc
,
990 return getSema().ActOnAsmStmt(AsmLoc
, IsSimple
, IsVolatile
, NumOutputs
,
991 NumInputs
, Names
, move(Constraints
),
992 Exprs
, AsmString
, Clobbers
,
996 /// \brief Build a new Objective-C @try statement.
998 /// By default, performs semantic analysis to build the new statement.
999 /// Subclasses may override this routine to provide different behavior.
1000 StmtResult
RebuildObjCAtTryStmt(SourceLocation AtLoc
,
1002 MultiStmtArg CatchStmts
,
1004 return getSema().ActOnObjCAtTryStmt(AtLoc
, TryBody
, move(CatchStmts
),
1008 /// \brief Rebuild an Objective-C exception declaration.
1010 /// By default, performs semantic analysis to build the new declaration.
1011 /// Subclasses may override this routine to provide different behavior.
1012 VarDecl
*RebuildObjCExceptionDecl(VarDecl
*ExceptionDecl
,
1013 TypeSourceInfo
*TInfo
, QualType T
) {
1014 return getSema().BuildObjCExceptionDecl(TInfo
, T
,
1015 ExceptionDecl
->getIdentifier(),
1016 ExceptionDecl
->getLocation());
1019 /// \brief Build a new Objective-C @catch statement.
1021 /// By default, performs semantic analysis to build the new statement.
1022 /// Subclasses may override this routine to provide different behavior.
1023 StmtResult
RebuildObjCAtCatchStmt(SourceLocation AtLoc
,
1024 SourceLocation RParenLoc
,
1027 return getSema().ActOnObjCAtCatchStmt(AtLoc
, RParenLoc
,
1031 /// \brief Build a new Objective-C @finally statement.
1033 /// By default, performs semantic analysis to build the new statement.
1034 /// Subclasses may override this routine to provide different behavior.
1035 StmtResult
RebuildObjCAtFinallyStmt(SourceLocation AtLoc
,
1037 return getSema().ActOnObjCAtFinallyStmt(AtLoc
, Body
);
1040 /// \brief Build a new Objective-C @throw statement.
1042 /// By default, performs semantic analysis to build the new statement.
1043 /// Subclasses may override this routine to provide different behavior.
1044 StmtResult
RebuildObjCAtThrowStmt(SourceLocation AtLoc
,
1046 return getSema().BuildObjCAtThrowStmt(AtLoc
, Operand
);
1049 /// \brief Build a new Objective-C @synchronized statement.
1051 /// By default, performs semantic analysis to build the new statement.
1052 /// Subclasses may override this routine to provide different behavior.
1053 StmtResult
RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc
,
1056 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc
, Object
,
1060 /// \brief Build a new Objective-C fast enumeration statement.
1062 /// By default, performs semantic analysis to build the new statement.
1063 /// Subclasses may override this routine to provide different behavior.
1064 StmtResult
RebuildObjCForCollectionStmt(SourceLocation ForLoc
,
1065 SourceLocation LParenLoc
,
1068 SourceLocation RParenLoc
,
1070 return getSema().ActOnObjCForCollectionStmt(ForLoc
, LParenLoc
,
1077 /// \brief Build a new C++ exception declaration.
1079 /// By default, performs semantic analysis to build the new decaration.
1080 /// Subclasses may override this routine to provide different behavior.
1081 VarDecl
*RebuildExceptionDecl(VarDecl
*ExceptionDecl
,
1082 TypeSourceInfo
*Declarator
,
1083 IdentifierInfo
*Name
,
1084 SourceLocation Loc
) {
1085 return getSema().BuildExceptionDeclaration(0, Declarator
, Name
, Loc
);
1088 /// \brief Build a new C++ catch statement.
1090 /// By default, performs semantic analysis to build the new statement.
1091 /// Subclasses may override this routine to provide different behavior.
1092 StmtResult
RebuildCXXCatchStmt(SourceLocation CatchLoc
,
1093 VarDecl
*ExceptionDecl
,
1095 return Owned(new (getSema().Context
) CXXCatchStmt(CatchLoc
, ExceptionDecl
,
1099 /// \brief Build a new C++ try statement.
1101 /// By default, performs semantic analysis to build the new statement.
1102 /// Subclasses may override this routine to provide different behavior.
1103 StmtResult
RebuildCXXTryStmt(SourceLocation TryLoc
,
1105 MultiStmtArg Handlers
) {
1106 return getSema().ActOnCXXTryBlock(TryLoc
, TryBlock
, move(Handlers
));
1109 /// \brief Build a new expression that references a declaration.
1111 /// By default, performs semantic analysis to build the new expression.
1112 /// Subclasses may override this routine to provide different behavior.
1113 ExprResult
RebuildDeclarationNameExpr(const CXXScopeSpec
&SS
,
1116 return getSema().BuildDeclarationNameExpr(SS
, R
, RequiresADL
);
1120 /// \brief Build a new expression that references a declaration.
1122 /// By default, performs semantic analysis to build the new expression.
1123 /// Subclasses may override this routine to provide different behavior.
1124 ExprResult
RebuildDeclRefExpr(NestedNameSpecifier
*Qualifier
,
1125 SourceRange QualifierRange
,
1127 const DeclarationNameInfo
&NameInfo
,
1128 TemplateArgumentListInfo
*TemplateArgs
) {
1130 SS
.setScopeRep(Qualifier
);
1131 SS
.setRange(QualifierRange
);
1133 // FIXME: loses template args.
1135 return getSema().BuildDeclarationNameExpr(SS
, NameInfo
, VD
);
1138 /// \brief Build a new expression in parentheses.
1140 /// By default, performs semantic analysis to build the new expression.
1141 /// Subclasses may override this routine to provide different behavior.
1142 ExprResult
RebuildParenExpr(Expr
*SubExpr
, SourceLocation LParen
,
1143 SourceLocation RParen
) {
1144 return getSema().ActOnParenExpr(LParen
, RParen
, SubExpr
);
1147 /// \brief Build a new pseudo-destructor expression.
1149 /// By default, performs semantic analysis to build the new expression.
1150 /// Subclasses may override this routine to provide different behavior.
1151 ExprResult
RebuildCXXPseudoDestructorExpr(Expr
*Base
,
1152 SourceLocation OperatorLoc
,
1154 NestedNameSpecifier
*Qualifier
,
1155 SourceRange QualifierRange
,
1156 TypeSourceInfo
*ScopeType
,
1157 SourceLocation CCLoc
,
1158 SourceLocation TildeLoc
,
1159 PseudoDestructorTypeStorage Destroyed
);
1161 /// \brief Build a new unary operator expression.
1163 /// By default, performs semantic analysis to build the new expression.
1164 /// Subclasses may override this routine to provide different behavior.
1165 ExprResult
RebuildUnaryOperator(SourceLocation OpLoc
,
1166 UnaryOperatorKind Opc
,
1168 return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc
, Opc
, SubExpr
);
1171 /// \brief Build a new builtin offsetof expression.
1173 /// By default, performs semantic analysis to build the new expression.
1174 /// Subclasses may override this routine to provide different behavior.
1175 ExprResult
RebuildOffsetOfExpr(SourceLocation OperatorLoc
,
1176 TypeSourceInfo
*Type
,
1177 Sema::OffsetOfComponent
*Components
,
1178 unsigned NumComponents
,
1179 SourceLocation RParenLoc
) {
1180 return getSema().BuildBuiltinOffsetOf(OperatorLoc
, Type
, Components
,
1181 NumComponents
, RParenLoc
);
1184 /// \brief Build a new sizeof or alignof expression with a type argument.
1186 /// By default, performs semantic analysis to build the new expression.
1187 /// Subclasses may override this routine to provide different behavior.
1188 ExprResult
RebuildSizeOfAlignOf(TypeSourceInfo
*TInfo
,
1189 SourceLocation OpLoc
,
1190 bool isSizeOf
, SourceRange R
) {
1191 return getSema().CreateSizeOfAlignOfExpr(TInfo
, OpLoc
, isSizeOf
, R
);
1194 /// \brief Build a new sizeof or alignof expression with an expression
1197 /// By default, performs semantic analysis to build the new expression.
1198 /// Subclasses may override this routine to provide different behavior.
1199 ExprResult
RebuildSizeOfAlignOf(Expr
*SubExpr
, SourceLocation OpLoc
,
1200 bool isSizeOf
, SourceRange R
) {
1202 = getSema().CreateSizeOfAlignOfExpr(SubExpr
, OpLoc
, isSizeOf
, R
);
1203 if (Result
.isInvalid())
1206 return move(Result
);
1209 /// \brief Build a new array subscript expression.
1211 /// By default, performs semantic analysis to build the new expression.
1212 /// Subclasses may override this routine to provide different behavior.
1213 ExprResult
RebuildArraySubscriptExpr(Expr
*LHS
,
1214 SourceLocation LBracketLoc
,
1216 SourceLocation RBracketLoc
) {
1217 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS
,
1222 /// \brief Build a new call expression.
1224 /// By default, performs semantic analysis to build the new expression.
1225 /// Subclasses may override this routine to provide different behavior.
1226 ExprResult
RebuildCallExpr(Expr
*Callee
, SourceLocation LParenLoc
,
1228 SourceLocation RParenLoc
) {
1229 return getSema().ActOnCallExpr(/*Scope=*/0, Callee
, LParenLoc
,
1230 move(Args
), RParenLoc
);
1233 /// \brief Build a new member access expression.
1235 /// By default, performs semantic analysis to build the new expression.
1236 /// Subclasses may override this routine to provide different behavior.
1237 ExprResult
RebuildMemberExpr(Expr
*Base
, SourceLocation OpLoc
,
1239 NestedNameSpecifier
*Qualifier
,
1240 SourceRange QualifierRange
,
1241 const DeclarationNameInfo
&MemberNameInfo
,
1243 NamedDecl
*FoundDecl
,
1244 const TemplateArgumentListInfo
*ExplicitTemplateArgs
,
1245 NamedDecl
*FirstQualifierInScope
) {
1246 if (!Member
->getDeclName()) {
1247 // We have a reference to an unnamed field. This is always the
1248 // base of an anonymous struct/union member access, i.e. the
1249 // field is always of record type.
1250 assert(!Qualifier
&& "Can't have an unnamed field with a qualifier!");
1251 assert(Member
->getType()->isRecordType() &&
1252 "unnamed member not of record type?");
1254 if (getSema().PerformObjectMemberConversion(Base
, Qualifier
,
1258 ExprValueKind VK
= isArrow
? VK_LValue
: Base
->getValueKind();
1260 new (getSema().Context
) MemberExpr(Base
, isArrow
,
1261 Member
, MemberNameInfo
,
1262 cast
<FieldDecl
>(Member
)->getType(),
1264 return getSema().Owned(ME
);
1269 SS
.setRange(QualifierRange
);
1270 SS
.setScopeRep(Qualifier
);
1273 getSema().DefaultFunctionArrayConversion(Base
);
1274 QualType BaseType
= Base
->getType();
1276 // FIXME: this involves duplicating earlier analysis in a lot of
1277 // cases; we should avoid this when possible.
1278 LookupResult
R(getSema(), MemberNameInfo
, Sema::LookupMemberName
);
1279 R
.addDecl(FoundDecl
);
1282 return getSema().BuildMemberReferenceExpr(Base
, BaseType
, OpLoc
, isArrow
,
1283 SS
, FirstQualifierInScope
,
1284 R
, ExplicitTemplateArgs
);
1287 /// \brief Build a new binary operator expression.
1289 /// By default, performs semantic analysis to build the new expression.
1290 /// Subclasses may override this routine to provide different behavior.
1291 ExprResult
RebuildBinaryOperator(SourceLocation OpLoc
,
1292 BinaryOperatorKind Opc
,
1293 Expr
*LHS
, Expr
*RHS
) {
1294 return getSema().BuildBinOp(/*Scope=*/0, OpLoc
, Opc
, LHS
, RHS
);
1297 /// \brief Build a new conditional operator expression.
1299 /// By default, performs semantic analysis to build the new expression.
1300 /// Subclasses may override this routine to provide different behavior.
1301 ExprResult
RebuildConditionalOperator(Expr
*Cond
,
1302 SourceLocation QuestionLoc
,
1304 SourceLocation ColonLoc
,
1306 return getSema().ActOnConditionalOp(QuestionLoc
, ColonLoc
, Cond
,
1310 /// \brief Build a new C-style cast expression.
1312 /// By default, performs semantic analysis to build the new expression.
1313 /// Subclasses may override this routine to provide different behavior.
1314 ExprResult
RebuildCStyleCastExpr(SourceLocation LParenLoc
,
1315 TypeSourceInfo
*TInfo
,
1316 SourceLocation RParenLoc
,
1318 return getSema().BuildCStyleCastExpr(LParenLoc
, TInfo
, RParenLoc
,
1322 /// \brief Build a new compound literal expression.
1324 /// By default, performs semantic analysis to build the new expression.
1325 /// Subclasses may override this routine to provide different behavior.
1326 ExprResult
RebuildCompoundLiteralExpr(SourceLocation LParenLoc
,
1327 TypeSourceInfo
*TInfo
,
1328 SourceLocation RParenLoc
,
1330 return getSema().BuildCompoundLiteralExpr(LParenLoc
, TInfo
, RParenLoc
,
1334 /// \brief Build a new extended vector element access expression.
1336 /// By default, performs semantic analysis to build the new expression.
1337 /// Subclasses may override this routine to provide different behavior.
1338 ExprResult
RebuildExtVectorElementExpr(Expr
*Base
,
1339 SourceLocation OpLoc
,
1340 SourceLocation AccessorLoc
,
1341 IdentifierInfo
&Accessor
) {
1344 DeclarationNameInfo
NameInfo(&Accessor
, AccessorLoc
);
1345 return getSema().BuildMemberReferenceExpr(Base
, Base
->getType(),
1346 OpLoc
, /*IsArrow*/ false,
1347 SS
, /*FirstQualifierInScope*/ 0,
1349 /* TemplateArgs */ 0);
1352 /// \brief Build a new initializer list expression.
1354 /// By default, performs semantic analysis to build the new expression.
1355 /// Subclasses may override this routine to provide different behavior.
1356 ExprResult
RebuildInitList(SourceLocation LBraceLoc
,
1358 SourceLocation RBraceLoc
,
1359 QualType ResultTy
) {
1361 = SemaRef
.ActOnInitList(LBraceLoc
, move(Inits
), RBraceLoc
);
1362 if (Result
.isInvalid() || ResultTy
->isDependentType())
1363 return move(Result
);
1365 // Patch in the result type we were given, which may have been computed
1366 // when the initial InitListExpr was built.
1367 InitListExpr
*ILE
= cast
<InitListExpr
>((Expr
*)Result
.get());
1368 ILE
->setType(ResultTy
);
1369 return move(Result
);
1372 /// \brief Build a new designated initializer expression.
1374 /// By default, performs semantic analysis to build the new expression.
1375 /// Subclasses may override this routine to provide different behavior.
1376 ExprResult
RebuildDesignatedInitExpr(Designation
&Desig
,
1377 MultiExprArg ArrayExprs
,
1378 SourceLocation EqualOrColonLoc
,
1382 = SemaRef
.ActOnDesignatedInitializer(Desig
, EqualOrColonLoc
, GNUSyntax
,
1384 if (Result
.isInvalid())
1387 ArrayExprs
.release();
1388 return move(Result
);
1391 /// \brief Build a new value-initialized expression.
1393 /// By default, builds the implicit value initialization without performing
1394 /// any semantic analysis. Subclasses may override this routine to provide
1395 /// different behavior.
1396 ExprResult
RebuildImplicitValueInitExpr(QualType T
) {
1397 return SemaRef
.Owned(new (SemaRef
.Context
) ImplicitValueInitExpr(T
));
1400 /// \brief Build a new \c va_arg expression.
1402 /// By default, performs semantic analysis to build the new expression.
1403 /// Subclasses may override this routine to provide different behavior.
1404 ExprResult
RebuildVAArgExpr(SourceLocation BuiltinLoc
,
1405 Expr
*SubExpr
, TypeSourceInfo
*TInfo
,
1406 SourceLocation RParenLoc
) {
1407 return getSema().BuildVAArgExpr(BuiltinLoc
,
1412 /// \brief Build a new expression list in parentheses.
1414 /// By default, performs semantic analysis to build the new expression.
1415 /// Subclasses may override this routine to provide different behavior.
1416 ExprResult
RebuildParenListExpr(SourceLocation LParenLoc
,
1417 MultiExprArg SubExprs
,
1418 SourceLocation RParenLoc
) {
1419 return getSema().ActOnParenOrParenListExpr(LParenLoc
, RParenLoc
,
1423 /// \brief Build a new address-of-label expression.
1425 /// By default, performs semantic analysis, using the name of the label
1426 /// rather than attempting to map the label statement itself.
1427 /// Subclasses may override this routine to provide different behavior.
1428 ExprResult
RebuildAddrLabelExpr(SourceLocation AmpAmpLoc
,
1429 SourceLocation LabelLoc
,
1431 return getSema().ActOnAddrLabel(AmpAmpLoc
, LabelLoc
, Label
->getID());
1434 /// \brief Build a new GNU statement expression.
1436 /// By default, performs semantic analysis to build the new expression.
1437 /// Subclasses may override this routine to provide different behavior.
1438 ExprResult
RebuildStmtExpr(SourceLocation LParenLoc
,
1440 SourceLocation RParenLoc
) {
1441 return getSema().ActOnStmtExpr(LParenLoc
, SubStmt
, RParenLoc
);
1444 /// \brief Build a new __builtin_choose_expr expression.
1446 /// By default, performs semantic analysis to build the new expression.
1447 /// Subclasses may override this routine to provide different behavior.
1448 ExprResult
RebuildChooseExpr(SourceLocation BuiltinLoc
,
1449 Expr
*Cond
, Expr
*LHS
, Expr
*RHS
,
1450 SourceLocation RParenLoc
) {
1451 return SemaRef
.ActOnChooseExpr(BuiltinLoc
,
1456 /// \brief Build a new overloaded operator call expression.
1458 /// By default, performs semantic analysis to build the new expression.
1459 /// The semantic analysis provides the behavior of template instantiation,
1460 /// copying with transformations that turn what looks like an overloaded
1461 /// operator call into a use of a builtin operator, performing
1462 /// argument-dependent lookup, etc. Subclasses may override this routine to
1463 /// provide different behavior.
1464 ExprResult
RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op
,
1465 SourceLocation OpLoc
,
1470 /// \brief Build a new C++ "named" cast expression, such as static_cast or
1471 /// reinterpret_cast.
1473 /// By default, this routine dispatches to one of the more-specific routines
1474 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1475 /// Subclasses may override this routine to provide different behavior.
1476 ExprResult
RebuildCXXNamedCastExpr(SourceLocation OpLoc
,
1477 Stmt::StmtClass Class
,
1478 SourceLocation LAngleLoc
,
1479 TypeSourceInfo
*TInfo
,
1480 SourceLocation RAngleLoc
,
1481 SourceLocation LParenLoc
,
1483 SourceLocation RParenLoc
) {
1485 case Stmt::CXXStaticCastExprClass
:
1486 return getDerived().RebuildCXXStaticCastExpr(OpLoc
, LAngleLoc
, TInfo
,
1487 RAngleLoc
, LParenLoc
,
1488 SubExpr
, RParenLoc
);
1490 case Stmt::CXXDynamicCastExprClass
:
1491 return getDerived().RebuildCXXDynamicCastExpr(OpLoc
, LAngleLoc
, TInfo
,
1492 RAngleLoc
, LParenLoc
,
1493 SubExpr
, RParenLoc
);
1495 case Stmt::CXXReinterpretCastExprClass
:
1496 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc
, LAngleLoc
, TInfo
,
1497 RAngleLoc
, LParenLoc
,
1501 case Stmt::CXXConstCastExprClass
:
1502 return getDerived().RebuildCXXConstCastExpr(OpLoc
, LAngleLoc
, TInfo
,
1503 RAngleLoc
, LParenLoc
,
1504 SubExpr
, RParenLoc
);
1507 assert(false && "Invalid C++ named cast");
1514 /// \brief Build a new C++ static_cast expression.
1516 /// By default, performs semantic analysis to build the new expression.
1517 /// Subclasses may override this routine to provide different behavior.
1518 ExprResult
RebuildCXXStaticCastExpr(SourceLocation OpLoc
,
1519 SourceLocation LAngleLoc
,
1520 TypeSourceInfo
*TInfo
,
1521 SourceLocation RAngleLoc
,
1522 SourceLocation LParenLoc
,
1524 SourceLocation RParenLoc
) {
1525 return getSema().BuildCXXNamedCast(OpLoc
, tok::kw_static_cast
,
1527 SourceRange(LAngleLoc
, RAngleLoc
),
1528 SourceRange(LParenLoc
, RParenLoc
));
1531 /// \brief Build a new C++ dynamic_cast expression.
1533 /// By default, performs semantic analysis to build the new expression.
1534 /// Subclasses may override this routine to provide different behavior.
1535 ExprResult
RebuildCXXDynamicCastExpr(SourceLocation OpLoc
,
1536 SourceLocation LAngleLoc
,
1537 TypeSourceInfo
*TInfo
,
1538 SourceLocation RAngleLoc
,
1539 SourceLocation LParenLoc
,
1541 SourceLocation RParenLoc
) {
1542 return getSema().BuildCXXNamedCast(OpLoc
, tok::kw_dynamic_cast
,
1544 SourceRange(LAngleLoc
, RAngleLoc
),
1545 SourceRange(LParenLoc
, RParenLoc
));
1548 /// \brief Build a new C++ reinterpret_cast expression.
1550 /// By default, performs semantic analysis to build the new expression.
1551 /// Subclasses may override this routine to provide different behavior.
1552 ExprResult
RebuildCXXReinterpretCastExpr(SourceLocation OpLoc
,
1553 SourceLocation LAngleLoc
,
1554 TypeSourceInfo
*TInfo
,
1555 SourceLocation RAngleLoc
,
1556 SourceLocation LParenLoc
,
1558 SourceLocation RParenLoc
) {
1559 return getSema().BuildCXXNamedCast(OpLoc
, tok::kw_reinterpret_cast
,
1561 SourceRange(LAngleLoc
, RAngleLoc
),
1562 SourceRange(LParenLoc
, RParenLoc
));
1565 /// \brief Build a new C++ const_cast expression.
1567 /// By default, performs semantic analysis to build the new expression.
1568 /// Subclasses may override this routine to provide different behavior.
1569 ExprResult
RebuildCXXConstCastExpr(SourceLocation OpLoc
,
1570 SourceLocation LAngleLoc
,
1571 TypeSourceInfo
*TInfo
,
1572 SourceLocation RAngleLoc
,
1573 SourceLocation LParenLoc
,
1575 SourceLocation RParenLoc
) {
1576 return getSema().BuildCXXNamedCast(OpLoc
, tok::kw_const_cast
,
1578 SourceRange(LAngleLoc
, RAngleLoc
),
1579 SourceRange(LParenLoc
, RParenLoc
));
1582 /// \brief Build a new C++ functional-style cast expression.
1584 /// By default, performs semantic analysis to build the new expression.
1585 /// Subclasses may override this routine to provide different behavior.
1586 ExprResult
RebuildCXXFunctionalCastExpr(TypeSourceInfo
*TInfo
,
1587 SourceLocation LParenLoc
,
1589 SourceLocation RParenLoc
) {
1590 return getSema().BuildCXXTypeConstructExpr(TInfo
, LParenLoc
,
1591 MultiExprArg(&Sub
, 1),
1595 /// \brief Build a new C++ typeid(type) expression.
1597 /// By default, performs semantic analysis to build the new expression.
1598 /// Subclasses may override this routine to provide different behavior.
1599 ExprResult
RebuildCXXTypeidExpr(QualType TypeInfoType
,
1600 SourceLocation TypeidLoc
,
1601 TypeSourceInfo
*Operand
,
1602 SourceLocation RParenLoc
) {
1603 return getSema().BuildCXXTypeId(TypeInfoType
, TypeidLoc
, Operand
,
1608 /// \brief Build a new C++ typeid(expr) expression.
1610 /// By default, performs semantic analysis to build the new expression.
1611 /// Subclasses may override this routine to provide different behavior.
1612 ExprResult
RebuildCXXTypeidExpr(QualType TypeInfoType
,
1613 SourceLocation TypeidLoc
,
1615 SourceLocation RParenLoc
) {
1616 return getSema().BuildCXXTypeId(TypeInfoType
, TypeidLoc
, Operand
,
1620 /// \brief Build a new C++ __uuidof(type) expression.
1622 /// By default, performs semantic analysis to build the new expression.
1623 /// Subclasses may override this routine to provide different behavior.
1624 ExprResult
RebuildCXXUuidofExpr(QualType TypeInfoType
,
1625 SourceLocation TypeidLoc
,
1626 TypeSourceInfo
*Operand
,
1627 SourceLocation RParenLoc
) {
1628 return getSema().BuildCXXUuidof(TypeInfoType
, TypeidLoc
, Operand
,
1632 /// \brief Build a new C++ __uuidof(expr) expression.
1634 /// By default, performs semantic analysis to build the new expression.
1635 /// Subclasses may override this routine to provide different behavior.
1636 ExprResult
RebuildCXXUuidofExpr(QualType TypeInfoType
,
1637 SourceLocation TypeidLoc
,
1639 SourceLocation RParenLoc
) {
1640 return getSema().BuildCXXUuidof(TypeInfoType
, TypeidLoc
, Operand
,
1644 /// \brief Build a new C++ "this" expression.
1646 /// By default, builds a new "this" expression without performing any
1647 /// semantic analysis. Subclasses may override this routine to provide
1648 /// different behavior.
1649 ExprResult
RebuildCXXThisExpr(SourceLocation ThisLoc
,
1652 return getSema().Owned(
1653 new (getSema().Context
) CXXThisExpr(ThisLoc
, ThisType
,
1657 /// \brief Build a new C++ throw expression.
1659 /// By default, performs semantic analysis to build the new expression.
1660 /// Subclasses may override this routine to provide different behavior.
1661 ExprResult
RebuildCXXThrowExpr(SourceLocation ThrowLoc
, Expr
*Sub
) {
1662 return getSema().ActOnCXXThrow(ThrowLoc
, Sub
);
1665 /// \brief Build a new C++ default-argument expression.
1667 /// By default, builds a new default-argument expression, which does not
1668 /// require any semantic analysis. Subclasses may override this routine to
1669 /// provide different behavior.
1670 ExprResult
RebuildCXXDefaultArgExpr(SourceLocation Loc
,
1671 ParmVarDecl
*Param
) {
1672 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context
, Loc
,
1676 /// \brief Build a new C++ zero-initialization expression.
1678 /// By default, performs semantic analysis to build the new expression.
1679 /// Subclasses may override this routine to provide different behavior.
1680 ExprResult
RebuildCXXScalarValueInitExpr(TypeSourceInfo
*TSInfo
,
1681 SourceLocation LParenLoc
,
1682 SourceLocation RParenLoc
) {
1683 return getSema().BuildCXXTypeConstructExpr(TSInfo
, LParenLoc
,
1684 MultiExprArg(getSema(), 0, 0),
1688 /// \brief Build a new C++ "new" expression.
1690 /// By default, performs semantic analysis to build the new expression.
1691 /// Subclasses may override this routine to provide different behavior.
1692 ExprResult
RebuildCXXNewExpr(SourceLocation StartLoc
,
1694 SourceLocation PlacementLParen
,
1695 MultiExprArg PlacementArgs
,
1696 SourceLocation PlacementRParen
,
1697 SourceRange TypeIdParens
,
1698 QualType AllocatedType
,
1699 TypeSourceInfo
*AllocatedTypeInfo
,
1701 SourceLocation ConstructorLParen
,
1702 MultiExprArg ConstructorArgs
,
1703 SourceLocation ConstructorRParen
) {
1704 return getSema().BuildCXXNew(StartLoc
, UseGlobal
,
1706 move(PlacementArgs
),
1713 move(ConstructorArgs
),
1717 /// \brief Build a new C++ "delete" expression.
1719 /// By default, performs semantic analysis to build the new expression.
1720 /// Subclasses may override this routine to provide different behavior.
1721 ExprResult
RebuildCXXDeleteExpr(SourceLocation StartLoc
,
1722 bool IsGlobalDelete
,
1725 return getSema().ActOnCXXDelete(StartLoc
, IsGlobalDelete
, IsArrayForm
,
1729 /// \brief Build a new unary type trait expression.
1731 /// By default, performs semantic analysis to build the new expression.
1732 /// Subclasses may override this routine to provide different behavior.
1733 ExprResult
RebuildUnaryTypeTrait(UnaryTypeTrait Trait
,
1734 SourceLocation StartLoc
,
1736 SourceLocation RParenLoc
) {
1737 return getSema().BuildUnaryTypeTrait(Trait
, StartLoc
, T
, RParenLoc
);
1740 /// \brief Build a new binary type trait expression.
1742 /// By default, performs semantic analysis to build the new expression.
1743 /// Subclasses may override this routine to provide different behavior.
1744 ExprResult
RebuildBinaryTypeTrait(BinaryTypeTrait Trait
,
1745 SourceLocation StartLoc
,
1746 TypeSourceInfo
*LhsT
,
1747 TypeSourceInfo
*RhsT
,
1748 SourceLocation RParenLoc
) {
1749 return getSema().BuildBinaryTypeTrait(Trait
, StartLoc
, LhsT
, RhsT
, RParenLoc
);
1752 /// \brief Build a new (previously unresolved) declaration reference
1755 /// By default, performs semantic analysis to build the new expression.
1756 /// Subclasses may override this routine to provide different behavior.
1757 ExprResult
RebuildDependentScopeDeclRefExpr(NestedNameSpecifier
*NNS
,
1758 SourceRange QualifierRange
,
1759 const DeclarationNameInfo
&NameInfo
,
1760 const TemplateArgumentListInfo
*TemplateArgs
) {
1762 SS
.setRange(QualifierRange
);
1763 SS
.setScopeRep(NNS
);
1766 return getSema().BuildQualifiedTemplateIdExpr(SS
, NameInfo
,
1769 return getSema().BuildQualifiedDeclarationNameExpr(SS
, NameInfo
);
1772 /// \brief Build a new template-id expression.
1774 /// By default, performs semantic analysis to build the new expression.
1775 /// Subclasses may override this routine to provide different behavior.
1776 ExprResult
RebuildTemplateIdExpr(const CXXScopeSpec
&SS
,
1779 const TemplateArgumentListInfo
&TemplateArgs
) {
1780 return getSema().BuildTemplateIdExpr(SS
, R
, RequiresADL
, TemplateArgs
);
1783 /// \brief Build a new object-construction expression.
1785 /// By default, performs semantic analysis to build the new expression.
1786 /// Subclasses may override this routine to provide different behavior.
1787 ExprResult
RebuildCXXConstructExpr(QualType T
,
1789 CXXConstructorDecl
*Constructor
,
1792 bool RequiresZeroInit
,
1793 CXXConstructExpr::ConstructionKind ConstructKind
,
1794 SourceRange ParenRange
) {
1795 ASTOwningVector
<Expr
*> ConvertedArgs(SemaRef
);
1796 if (getSema().CompleteConstructorCall(Constructor
, move(Args
), Loc
,
1800 return getSema().BuildCXXConstructExpr(Loc
, T
, Constructor
, IsElidable
,
1801 move_arg(ConvertedArgs
),
1802 RequiresZeroInit
, ConstructKind
,
1806 /// \brief Build a new object-construction expression.
1808 /// By default, performs semantic analysis to build the new expression.
1809 /// Subclasses may override this routine to provide different behavior.
1810 ExprResult
RebuildCXXTemporaryObjectExpr(TypeSourceInfo
*TSInfo
,
1811 SourceLocation LParenLoc
,
1813 SourceLocation RParenLoc
) {
1814 return getSema().BuildCXXTypeConstructExpr(TSInfo
,
1820 /// \brief Build a new object-construction expression.
1822 /// By default, performs semantic analysis to build the new expression.
1823 /// Subclasses may override this routine to provide different behavior.
1824 ExprResult
RebuildCXXUnresolvedConstructExpr(TypeSourceInfo
*TSInfo
,
1825 SourceLocation LParenLoc
,
1827 SourceLocation RParenLoc
) {
1828 return getSema().BuildCXXTypeConstructExpr(TSInfo
,
1834 /// \brief Build a new member reference expression.
1836 /// By default, performs semantic analysis to build the new expression.
1837 /// Subclasses may override this routine to provide different behavior.
1838 ExprResult
RebuildCXXDependentScopeMemberExpr(Expr
*BaseE
,
1841 SourceLocation OperatorLoc
,
1842 NestedNameSpecifier
*Qualifier
,
1843 SourceRange QualifierRange
,
1844 NamedDecl
*FirstQualifierInScope
,
1845 const DeclarationNameInfo
&MemberNameInfo
,
1846 const TemplateArgumentListInfo
*TemplateArgs
) {
1848 SS
.setRange(QualifierRange
);
1849 SS
.setScopeRep(Qualifier
);
1851 return SemaRef
.BuildMemberReferenceExpr(BaseE
, BaseType
,
1852 OperatorLoc
, IsArrow
,
1853 SS
, FirstQualifierInScope
,
1858 /// \brief Build a new member reference expression.
1860 /// By default, performs semantic analysis to build the new expression.
1861 /// Subclasses may override this routine to provide different behavior.
1862 ExprResult
RebuildUnresolvedMemberExpr(Expr
*BaseE
,
1864 SourceLocation OperatorLoc
,
1866 NestedNameSpecifier
*Qualifier
,
1867 SourceRange QualifierRange
,
1868 NamedDecl
*FirstQualifierInScope
,
1870 const TemplateArgumentListInfo
*TemplateArgs
) {
1872 SS
.setRange(QualifierRange
);
1873 SS
.setScopeRep(Qualifier
);
1875 return SemaRef
.BuildMemberReferenceExpr(BaseE
, BaseType
,
1876 OperatorLoc
, IsArrow
,
1877 SS
, FirstQualifierInScope
,
1881 /// \brief Build a new noexcept expression.
1883 /// By default, performs semantic analysis to build the new expression.
1884 /// Subclasses may override this routine to provide different behavior.
1885 ExprResult
RebuildCXXNoexceptExpr(SourceRange Range
, Expr
*Arg
) {
1886 return SemaRef
.BuildCXXNoexceptExpr(Range
.getBegin(), Arg
, Range
.getEnd());
1889 /// \brief Build a new Objective-C @encode expression.
1891 /// By default, performs semantic analysis to build the new expression.
1892 /// Subclasses may override this routine to provide different behavior.
1893 ExprResult
RebuildObjCEncodeExpr(SourceLocation AtLoc
,
1894 TypeSourceInfo
*EncodeTypeInfo
,
1895 SourceLocation RParenLoc
) {
1896 return SemaRef
.Owned(SemaRef
.BuildObjCEncodeExpression(AtLoc
, EncodeTypeInfo
,
1900 /// \brief Build a new Objective-C class message.
1901 ExprResult
RebuildObjCMessageExpr(TypeSourceInfo
*ReceiverTypeInfo
,
1903 SourceLocation SelectorLoc
,
1904 ObjCMethodDecl
*Method
,
1905 SourceLocation LBracLoc
,
1907 SourceLocation RBracLoc
) {
1908 return SemaRef
.BuildClassMessage(ReceiverTypeInfo
,
1909 ReceiverTypeInfo
->getType(),
1910 /*SuperLoc=*/SourceLocation(),
1911 Sel
, Method
, LBracLoc
, SelectorLoc
,
1912 RBracLoc
, move(Args
));
1915 /// \brief Build a new Objective-C instance message.
1916 ExprResult
RebuildObjCMessageExpr(Expr
*Receiver
,
1918 SourceLocation SelectorLoc
,
1919 ObjCMethodDecl
*Method
,
1920 SourceLocation LBracLoc
,
1922 SourceLocation RBracLoc
) {
1923 return SemaRef
.BuildInstanceMessage(Receiver
,
1924 Receiver
->getType(),
1925 /*SuperLoc=*/SourceLocation(),
1926 Sel
, Method
, LBracLoc
, SelectorLoc
,
1927 RBracLoc
, move(Args
));
1930 /// \brief Build a new Objective-C ivar reference expression.
1932 /// By default, performs semantic analysis to build the new expression.
1933 /// Subclasses may override this routine to provide different behavior.
1934 ExprResult
RebuildObjCIvarRefExpr(Expr
*BaseArg
, ObjCIvarDecl
*Ivar
,
1935 SourceLocation IvarLoc
,
1936 bool IsArrow
, bool IsFreeIvar
) {
1937 // FIXME: We lose track of the IsFreeIvar bit.
1939 Expr
*Base
= BaseArg
;
1940 LookupResult
R(getSema(), Ivar
->getDeclName(), IvarLoc
,
1941 Sema::LookupMemberName
);
1942 ExprResult Result
= getSema().LookupMemberExpr(R
, Base
, IsArrow
,
1946 if (Result
.isInvalid())
1950 return move(Result
);
1952 return getSema().BuildMemberReferenceExpr(Base
, Base
->getType(),
1953 /*FIXME:*/IvarLoc
, IsArrow
, SS
,
1954 /*FirstQualifierInScope=*/0,
1956 /*TemplateArgs=*/0);
1959 /// \brief Build a new Objective-C property reference expression.
1961 /// By default, performs semantic analysis to build the new expression.
1962 /// Subclasses may override this routine to provide different behavior.
1963 ExprResult
RebuildObjCPropertyRefExpr(Expr
*BaseArg
,
1964 ObjCPropertyDecl
*Property
,
1965 SourceLocation PropertyLoc
) {
1967 Expr
*Base
= BaseArg
;
1968 LookupResult
R(getSema(), Property
->getDeclName(), PropertyLoc
,
1969 Sema::LookupMemberName
);
1970 bool IsArrow
= false;
1971 ExprResult Result
= getSema().LookupMemberExpr(R
, Base
, IsArrow
,
1972 /*FIME:*/PropertyLoc
,
1974 if (Result
.isInvalid())
1978 return move(Result
);
1980 return getSema().BuildMemberReferenceExpr(Base
, Base
->getType(),
1981 /*FIXME:*/PropertyLoc
, IsArrow
,
1983 /*FirstQualifierInScope=*/0,
1985 /*TemplateArgs=*/0);
1988 /// \brief Build a new Objective-C property reference expression.
1990 /// By default, performs semantic analysis to build the new expression.
1991 /// Subclasses may override this routine to provide different behavior.
1992 ExprResult
RebuildObjCPropertyRefExpr(Expr
*Base
, QualType T
,
1993 ObjCMethodDecl
*Getter
,
1994 ObjCMethodDecl
*Setter
,
1995 SourceLocation PropertyLoc
) {
1996 // Since these expressions can only be value-dependent, we do not
1997 // need to perform semantic analysis again.
1999 new (getSema().Context
) ObjCPropertyRefExpr(Getter
, Setter
, T
,
2000 VK_LValue
, OK_ObjCProperty
,
2001 PropertyLoc
, Base
));
2004 /// \brief Build a new Objective-C "isa" expression.
2006 /// By default, performs semantic analysis to build the new expression.
2007 /// Subclasses may override this routine to provide different behavior.
2008 ExprResult
RebuildObjCIsaExpr(Expr
*BaseArg
, SourceLocation IsaLoc
,
2011 Expr
*Base
= BaseArg
;
2012 LookupResult
R(getSema(), &getSema().Context
.Idents
.get("isa"), IsaLoc
,
2013 Sema::LookupMemberName
);
2014 ExprResult Result
= getSema().LookupMemberExpr(R
, Base
, IsArrow
,
2017 if (Result
.isInvalid())
2021 return move(Result
);
2023 return getSema().BuildMemberReferenceExpr(Base
, Base
->getType(),
2024 /*FIXME:*/IsaLoc
, IsArrow
, SS
,
2025 /*FirstQualifierInScope=*/0,
2027 /*TemplateArgs=*/0);
2030 /// \brief Build a new shuffle vector expression.
2032 /// By default, performs semantic analysis to build the new expression.
2033 /// Subclasses may override this routine to provide different behavior.
2034 ExprResult
RebuildShuffleVectorExpr(SourceLocation BuiltinLoc
,
2035 MultiExprArg SubExprs
,
2036 SourceLocation RParenLoc
) {
2037 // Find the declaration for __builtin_shufflevector
2038 const IdentifierInfo
&Name
2039 = SemaRef
.Context
.Idents
.get("__builtin_shufflevector");
2040 TranslationUnitDecl
*TUDecl
= SemaRef
.Context
.getTranslationUnitDecl();
2041 DeclContext::lookup_result Lookup
= TUDecl
->lookup(DeclarationName(&Name
));
2042 assert(Lookup
.first
!= Lookup
.second
&& "No __builtin_shufflevector?");
2044 // Build a reference to the __builtin_shufflevector builtin
2045 FunctionDecl
*Builtin
= cast
<FunctionDecl
>(*Lookup
.first
);
2047 = new (SemaRef
.Context
) DeclRefExpr(Builtin
, Builtin
->getType(),
2048 VK_LValue
, BuiltinLoc
);
2049 SemaRef
.UsualUnaryConversions(Callee
);
2051 // Build the CallExpr
2052 unsigned NumSubExprs
= SubExprs
.size();
2053 Expr
**Subs
= (Expr
**)SubExprs
.release();
2054 CallExpr
*TheCall
= new (SemaRef
.Context
) CallExpr(SemaRef
.Context
, Callee
,
2056 Builtin
->getCallResultType(),
2057 Expr::getValueKindForType(Builtin
->getResultType()),
2059 ExprResult
OwnedCall(SemaRef
.Owned(TheCall
));
2061 // Type-check the __builtin_shufflevector expression.
2062 ExprResult Result
= SemaRef
.SemaBuiltinShuffleVector(TheCall
);
2063 if (Result
.isInvalid())
2066 OwnedCall
.release();
2067 return move(Result
);
2070 /// \brief Build a new template argument pack expansion.
2072 /// By default, performs semantic analysis to build a new pack expansion
2073 /// for a template argument. Subclasses may override this routine to provide
2074 /// different behavior.
2075 TemplateArgumentLoc
RebuildPackExpansion(TemplateArgumentLoc Pattern
,
2076 SourceLocation EllipsisLoc
) {
2077 switch (Pattern
.getArgument().getKind()) {
2078 case TemplateArgument::Expression
:
2079 case TemplateArgument::Template
:
2080 llvm_unreachable("Unsupported pack expansion of expressions/templates");
2082 case TemplateArgument::Null
:
2083 case TemplateArgument::Integral
:
2084 case TemplateArgument::Declaration
:
2085 case TemplateArgument::Pack
:
2086 llvm_unreachable("Pack expansion pattern has no parameter packs");
2088 case TemplateArgument::Type
:
2089 if (TypeSourceInfo
*Expansion
2090 = getSema().CheckPackExpansion(Pattern
.getTypeSourceInfo(),
2092 return TemplateArgumentLoc(TemplateArgument(Expansion
->getType()),
2097 return TemplateArgumentLoc();
2101 QualType
TransformTypeInObjectScope(QualType T
,
2102 QualType ObjectType
,
2103 NamedDecl
*FirstQualifierInScope
,
2104 NestedNameSpecifier
*Prefix
);
2106 TypeSourceInfo
*TransformTypeInObjectScope(TypeSourceInfo
*T
,
2107 QualType ObjectType
,
2108 NamedDecl
*FirstQualifierInScope
,
2109 NestedNameSpecifier
*Prefix
);
2112 template<typename Derived
>
2113 StmtResult TreeTransform
<Derived
>::TransformStmt(Stmt
*S
) {
2115 return SemaRef
.Owned(S
);
2117 switch (S
->getStmtClass()) {
2118 case Stmt::NoStmtClass
: break;
2120 // Transform individual statement nodes
2121 #define STMT(Node, Parent) \
2122 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
2123 #define EXPR(Node, Parent)
2124 #include "clang/AST/StmtNodes.inc"
2126 // Transform expressions by calling TransformExpr.
2127 #define STMT(Node, Parent)
2128 #define ABSTRACT_STMT(Stmt)
2129 #define EXPR(Node, Parent) case Stmt::Node##Class:
2130 #include "clang/AST/StmtNodes.inc"
2132 ExprResult E
= getDerived().TransformExpr(cast
<Expr
>(S
));
2136 return getSema().ActOnExprStmt(getSema().MakeFullExpr(E
.take()));
2140 return SemaRef
.Owned(S
);
2144 template<typename Derived
>
2145 ExprResult TreeTransform
<Derived
>::TransformExpr(Expr
*E
) {
2147 return SemaRef
.Owned(E
);
2149 switch (E
->getStmtClass()) {
2150 case Stmt::NoStmtClass
: break;
2151 #define STMT(Node, Parent) case Stmt::Node##Class: break;
2152 #define ABSTRACT_STMT(Stmt)
2153 #define EXPR(Node, Parent) \
2154 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
2155 #include "clang/AST/StmtNodes.inc"
2158 return SemaRef
.Owned(E
);
2161 template<typename Derived
>
2162 NestedNameSpecifier
*
2163 TreeTransform
<Derived
>::TransformNestedNameSpecifier(NestedNameSpecifier
*NNS
,
2165 QualType ObjectType
,
2166 NamedDecl
*FirstQualifierInScope
) {
2167 NestedNameSpecifier
*Prefix
= NNS
->getPrefix();
2169 // Transform the prefix of this nested name specifier.
2171 Prefix
= getDerived().TransformNestedNameSpecifier(Prefix
, Range
,
2173 FirstQualifierInScope
);
2178 switch (NNS
->getKind()) {
2179 case NestedNameSpecifier::Identifier
:
2181 // The object type and qualifier-in-scope really apply to the
2183 ObjectType
= QualType();
2184 FirstQualifierInScope
= 0;
2187 assert((Prefix
|| !ObjectType
.isNull()) &&
2188 "Identifier nested-name-specifier with no prefix or object type");
2189 if (!getDerived().AlwaysRebuild() && Prefix
== NNS
->getPrefix() &&
2190 ObjectType
.isNull())
2193 return getDerived().RebuildNestedNameSpecifier(Prefix
, Range
,
2194 *NNS
->getAsIdentifier(),
2196 FirstQualifierInScope
);
2198 case NestedNameSpecifier::Namespace
: {
2200 = cast_or_null
<NamespaceDecl
>(
2201 getDerived().TransformDecl(Range
.getBegin(),
2202 NNS
->getAsNamespace()));
2203 if (!getDerived().AlwaysRebuild() &&
2204 Prefix
== NNS
->getPrefix() &&
2205 NS
== NNS
->getAsNamespace())
2208 return getDerived().RebuildNestedNameSpecifier(Prefix
, Range
, NS
);
2211 case NestedNameSpecifier::Global
:
2212 // There is no meaningful transformation that one could perform on the
2216 case NestedNameSpecifier::TypeSpecWithTemplate
:
2217 case NestedNameSpecifier::TypeSpec
: {
2218 TemporaryBase
Rebase(*this, Range
.getBegin(), DeclarationName());
2219 QualType T
= TransformTypeInObjectScope(QualType(NNS
->getAsType(), 0),
2221 FirstQualifierInScope
,
2226 if (!getDerived().AlwaysRebuild() &&
2227 Prefix
== NNS
->getPrefix() &&
2228 T
== QualType(NNS
->getAsType(), 0))
2231 return getDerived().RebuildNestedNameSpecifier(Prefix
, Range
,
2232 NNS
->getKind() == NestedNameSpecifier::TypeSpecWithTemplate
,
2237 // Required to silence a GCC warning
2241 template<typename Derived
>
2243 TreeTransform
<Derived
>
2244 ::TransformDeclarationNameInfo(const DeclarationNameInfo
&NameInfo
) {
2245 DeclarationName Name
= NameInfo
.getName();
2247 return DeclarationNameInfo();
2249 switch (Name
.getNameKind()) {
2250 case DeclarationName::Identifier
:
2251 case DeclarationName::ObjCZeroArgSelector
:
2252 case DeclarationName::ObjCOneArgSelector
:
2253 case DeclarationName::ObjCMultiArgSelector
:
2254 case DeclarationName::CXXOperatorName
:
2255 case DeclarationName::CXXLiteralOperatorName
:
2256 case DeclarationName::CXXUsingDirective
:
2259 case DeclarationName::CXXConstructorName
:
2260 case DeclarationName::CXXDestructorName
:
2261 case DeclarationName::CXXConversionFunctionName
: {
2262 TypeSourceInfo
*NewTInfo
;
2263 CanQualType NewCanTy
;
2264 if (TypeSourceInfo
*OldTInfo
= NameInfo
.getNamedTypeInfo()) {
2265 NewTInfo
= getDerived().TransformType(OldTInfo
);
2267 return DeclarationNameInfo();
2268 NewCanTy
= SemaRef
.Context
.getCanonicalType(NewTInfo
->getType());
2272 TemporaryBase
Rebase(*this, NameInfo
.getLoc(), Name
);
2273 QualType NewT
= getDerived().TransformType(Name
.getCXXNameType());
2275 return DeclarationNameInfo();
2276 NewCanTy
= SemaRef
.Context
.getCanonicalType(NewT
);
2279 DeclarationName NewName
2280 = SemaRef
.Context
.DeclarationNames
.getCXXSpecialName(Name
.getNameKind(),
2282 DeclarationNameInfo
NewNameInfo(NameInfo
);
2283 NewNameInfo
.setName(NewName
);
2284 NewNameInfo
.setNamedTypeInfo(NewTInfo
);
2289 assert(0 && "Unknown name kind.");
2290 return DeclarationNameInfo();
2293 template<typename Derived
>
2295 TreeTransform
<Derived
>::TransformTemplateName(TemplateName Name
,
2296 QualType ObjectType
,
2297 NamedDecl
*FirstQualifierInScope
) {
2298 SourceLocation Loc
= getDerived().getBaseLocation();
2300 if (QualifiedTemplateName
*QTN
= Name
.getAsQualifiedTemplateName()) {
2301 NestedNameSpecifier
*NNS
2302 = getDerived().TransformNestedNameSpecifier(QTN
->getQualifier(),
2303 /*FIXME*/ SourceRange(Loc
),
2305 FirstQualifierInScope
);
2307 return TemplateName();
2309 if (TemplateDecl
*Template
= QTN
->getTemplateDecl()) {
2310 TemplateDecl
*TransTemplate
2311 = cast_or_null
<TemplateDecl
>(getDerived().TransformDecl(Loc
, Template
));
2313 return TemplateName();
2315 if (!getDerived().AlwaysRebuild() &&
2316 NNS
== QTN
->getQualifier() &&
2317 TransTemplate
== Template
)
2320 return getDerived().RebuildTemplateName(NNS
, QTN
->hasTemplateKeyword(),
2324 // These should be getting filtered out before they make it into the AST.
2325 llvm_unreachable("overloaded template name survived to here");
2328 if (DependentTemplateName
*DTN
= Name
.getAsDependentTemplateName()) {
2329 NestedNameSpecifier
*NNS
= DTN
->getQualifier();
2331 NNS
= getDerived().TransformNestedNameSpecifier(NNS
,
2332 /*FIXME:*/SourceRange(Loc
),
2334 FirstQualifierInScope
);
2335 if (!NNS
) return TemplateName();
2337 // These apply to the scope specifier, not the template.
2338 ObjectType
= QualType();
2339 FirstQualifierInScope
= 0;
2342 if (!getDerived().AlwaysRebuild() &&
2343 NNS
== DTN
->getQualifier() &&
2344 ObjectType
.isNull())
2347 if (DTN
->isIdentifier()) {
2349 SourceRange
QualifierRange(getDerived().getBaseLocation());
2350 return getDerived().RebuildTemplateName(NNS
, QualifierRange
,
2351 *DTN
->getIdentifier(),
2353 FirstQualifierInScope
);
2356 return getDerived().RebuildTemplateName(NNS
, DTN
->getOperator(),
2360 if (TemplateDecl
*Template
= Name
.getAsTemplateDecl()) {
2361 TemplateDecl
*TransTemplate
2362 = cast_or_null
<TemplateDecl
>(getDerived().TransformDecl(Loc
, Template
));
2364 return TemplateName();
2366 if (!getDerived().AlwaysRebuild() &&
2367 TransTemplate
== Template
)
2370 return TemplateName(TransTemplate
);
2373 // These should be getting filtered out before they reach the AST.
2374 llvm_unreachable("overloaded function decl survived to here");
2375 return TemplateName();
2378 template<typename Derived
>
2379 void TreeTransform
<Derived
>::InventTemplateArgumentLoc(
2380 const TemplateArgument
&Arg
,
2381 TemplateArgumentLoc
&Output
) {
2382 SourceLocation Loc
= getDerived().getBaseLocation();
2383 switch (Arg
.getKind()) {
2384 case TemplateArgument::Null
:
2385 llvm_unreachable("null template argument in TreeTransform");
2388 case TemplateArgument::Type
:
2389 Output
= TemplateArgumentLoc(Arg
,
2390 SemaRef
.Context
.getTrivialTypeSourceInfo(Arg
.getAsType(), Loc
));
2394 case TemplateArgument::Template
:
2395 Output
= TemplateArgumentLoc(Arg
, SourceRange(), Loc
);
2398 case TemplateArgument::Expression
:
2399 Output
= TemplateArgumentLoc(Arg
, Arg
.getAsExpr());
2402 case TemplateArgument::Declaration
:
2403 case TemplateArgument::Integral
:
2404 case TemplateArgument::Pack
:
2405 Output
= TemplateArgumentLoc(Arg
, TemplateArgumentLocInfo());
2410 template<typename Derived
>
2411 bool TreeTransform
<Derived
>::TransformTemplateArgument(
2412 const TemplateArgumentLoc
&Input
,
2413 TemplateArgumentLoc
&Output
) {
2414 const TemplateArgument
&Arg
= Input
.getArgument();
2415 switch (Arg
.getKind()) {
2416 case TemplateArgument::Null
:
2417 case TemplateArgument::Integral
:
2421 case TemplateArgument::Type
: {
2422 TypeSourceInfo
*DI
= Input
.getTypeSourceInfo();
2424 DI
= InventTypeSourceInfo(Input
.getArgument().getAsType());
2426 DI
= getDerived().TransformType(DI
);
2427 if (!DI
) return true;
2429 Output
= TemplateArgumentLoc(TemplateArgument(DI
->getType()), DI
);
2433 case TemplateArgument::Declaration
: {
2434 // FIXME: we should never have to transform one of these.
2435 DeclarationName Name
;
2436 if (NamedDecl
*ND
= dyn_cast
<NamedDecl
>(Arg
.getAsDecl()))
2437 Name
= ND
->getDeclName();
2438 TemporaryBase
Rebase(*this, Input
.getLocation(), Name
);
2439 Decl
*D
= getDerived().TransformDecl(Input
.getLocation(), Arg
.getAsDecl());
2440 if (!D
) return true;
2442 Expr
*SourceExpr
= Input
.getSourceDeclExpression();
2444 EnterExpressionEvaluationContext
Unevaluated(getSema(),
2446 ExprResult E
= getDerived().TransformExpr(SourceExpr
);
2447 SourceExpr
= (E
.isInvalid() ? 0 : E
.take());
2450 Output
= TemplateArgumentLoc(TemplateArgument(D
), SourceExpr
);
2454 case TemplateArgument::Template
: {
2455 TemporaryBase
Rebase(*this, Input
.getLocation(), DeclarationName());
2456 TemplateName Template
2457 = getDerived().TransformTemplateName(Arg
.getAsTemplate());
2458 if (Template
.isNull())
2461 Output
= TemplateArgumentLoc(TemplateArgument(Template
),
2462 Input
.getTemplateQualifierRange(),
2463 Input
.getTemplateNameLoc());
2467 case TemplateArgument::Expression
: {
2468 // Template argument expressions are not potentially evaluated.
2469 EnterExpressionEvaluationContext
Unevaluated(getSema(),
2472 Expr
*InputExpr
= Input
.getSourceExpression();
2473 if (!InputExpr
) InputExpr
= Input
.getArgument().getAsExpr();
2476 = getDerived().TransformExpr(InputExpr
);
2477 if (E
.isInvalid()) return true;
2478 Output
= TemplateArgumentLoc(TemplateArgument(E
.take()), E
.take());
2482 case TemplateArgument::Pack
: {
2483 llvm::SmallVector
<TemplateArgument
, 4> TransformedArgs
;
2484 TransformedArgs
.reserve(Arg
.pack_size());
2485 for (TemplateArgument::pack_iterator A
= Arg
.pack_begin(),
2486 AEnd
= Arg
.pack_end();
2489 // FIXME: preserve source information here when we start
2490 // caring about parameter packs.
2492 TemplateArgumentLoc InputArg
;
2493 TemplateArgumentLoc OutputArg
;
2494 getDerived().InventTemplateArgumentLoc(*A
, InputArg
);
2495 if (getDerived().TransformTemplateArgument(InputArg
, OutputArg
))
2498 TransformedArgs
.push_back(OutputArg
.getArgument());
2501 TemplateArgument
*TransformedArgsPtr
2502 = new (getSema().Context
) TemplateArgument
[TransformedArgs
.size()];
2503 std::copy(TransformedArgs
.begin(), TransformedArgs
.end(),
2504 TransformedArgsPtr
);
2505 Output
= TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr
,
2506 TransformedArgs
.size()),
2507 Input
.getLocInfo());
2512 // Work around bogus GCC warning
2516 /// \brief Iterator adaptor that invents template argument location information
2517 /// for each of the template arguments in its underlying iterator.
2518 template<typename Derived
, typename InputIterator
>
2519 class TemplateArgumentLocInventIterator
{
2520 TreeTransform
<Derived
> &Self
;
2524 typedef TemplateArgumentLoc value_type
;
2525 typedef TemplateArgumentLoc reference
;
2526 typedef typename
std::iterator_traits
<InputIterator
>::difference_type
2528 typedef std::input_iterator_tag iterator_category
;
2531 TemplateArgumentLoc Arg
;
2534 explicit pointer(TemplateArgumentLoc Arg
) : Arg(Arg
) { }
2536 const TemplateArgumentLoc
*operator->() const { return &Arg
; }
2539 TemplateArgumentLocInventIterator() { }
2541 explicit TemplateArgumentLocInventIterator(TreeTransform
<Derived
> &Self
,
2543 : Self(Self
), Iter(Iter
) { }
2545 TemplateArgumentLocInventIterator
&operator++() {
2550 TemplateArgumentLocInventIterator
operator++(int) {
2551 TemplateArgumentLocInventIterator
Old(*this);
2556 reference
operator*() const {
2557 TemplateArgumentLoc Result
;
2558 Self
.InventTemplateArgumentLoc(*Iter
, Result
);
2562 pointer
operator->() const { return pointer(**this); }
2564 friend bool operator==(const TemplateArgumentLocInventIterator
&X
,
2565 const TemplateArgumentLocInventIterator
&Y
) {
2566 return X
.Iter
== Y
.Iter
;
2569 friend bool operator!=(const TemplateArgumentLocInventIterator
&X
,
2570 const TemplateArgumentLocInventIterator
&Y
) {
2571 return X
.Iter
!= Y
.Iter
;
2575 template<typename Derived
>
2576 template<typename InputIterator
>
2577 bool TreeTransform
<Derived
>::TransformTemplateArguments(InputIterator First
,
2579 TemplateArgumentListInfo
&Outputs
) {
2580 for (; First
!= Last
; ++First
) {
2581 TemplateArgumentLoc Out
;
2582 TemplateArgumentLoc In
= *First
;
2584 if (In
.getArgument().getKind() == TemplateArgument::Pack
) {
2585 // Unpack argument packs, which we translate them into separate
2587 // FIXME: We could do much better if we could guarantee that the
2588 // TemplateArgumentLocInfo for the pack expansion would be usable for
2589 // all of the template arguments in the argument pack.
2590 typedef TemplateArgumentLocInventIterator
<Derived
,
2591 TemplateArgument::pack_iterator
>
2593 if (TransformTemplateArguments(PackLocIterator(*this,
2594 In
.getArgument().pack_begin()),
2595 PackLocIterator(*this,
2596 In
.getArgument().pack_end()),
2603 if (In
.getArgument().isPackExpansion()) {
2604 // We have a pack expansion, for which we will be substituting into
2606 SourceLocation Ellipsis
;
2607 TemplateArgumentLoc Pattern
2608 = In
.getPackExpansionPattern(Ellipsis
, getSema().Context
);
2610 llvm::SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
2611 getSema().collectUnexpandedParameterPacks(Pattern
, Unexpanded
);
2612 assert(!Unexpanded
.empty() && "Pack expansion without parameter packs?");
2614 // Determine whether the set of unexpanded parameter packs can and should
2617 unsigned NumExpansions
= 0;
2618 if (getDerived().TryExpandParameterPacks(Ellipsis
,
2619 Pattern
.getSourceRange(),
2622 Expand
, NumExpansions
))
2626 // The transform has determined that we should perform a simple
2627 // transformation on the pack expansion, producing another pack
2629 TemplateArgumentLoc OutPattern
;
2630 Sema::ArgumentPackSubstitutionIndexRAII
SubstIndex(getSema(), -1);
2631 if (getDerived().TransformTemplateArgument(Pattern
, OutPattern
))
2634 Out
= getDerived().RebuildPackExpansion(OutPattern
, Ellipsis
);
2635 if (Out
.getArgument().isNull())
2638 Outputs
.addArgument(Out
);
2642 // The transform has determined that we should perform an elementwise
2643 // expansion of the pattern. Do so.
2644 for (unsigned I
= 0; I
!= NumExpansions
; ++I
) {
2645 Sema::ArgumentPackSubstitutionIndexRAII
SubstIndex(getSema(), I
);
2647 if (getDerived().TransformTemplateArgument(Pattern
, Out
))
2650 Outputs
.addArgument(Out
);
2657 if (getDerived().TransformTemplateArgument(In
, Out
))
2660 Outputs
.addArgument(Out
);
2667 //===----------------------------------------------------------------------===//
2668 // Type transformation
2669 //===----------------------------------------------------------------------===//
2671 template<typename Derived
>
2672 QualType TreeTransform
<Derived
>::TransformType(QualType T
) {
2673 if (getDerived().AlreadyTransformed(T
))
2676 // Temporary workaround. All of these transformations should
2677 // eventually turn into transformations on TypeLocs.
2678 TypeSourceInfo
*DI
= getSema().Context
.CreateTypeSourceInfo(T
);
2679 DI
->getTypeLoc().initialize(getDerived().getBaseLocation());
2681 TypeSourceInfo
*NewDI
= getDerived().TransformType(DI
);
2686 return NewDI
->getType();
2689 template<typename Derived
>
2690 TypeSourceInfo
*TreeTransform
<Derived
>::TransformType(TypeSourceInfo
*DI
) {
2691 if (getDerived().AlreadyTransformed(DI
->getType()))
2696 TypeLoc TL
= DI
->getTypeLoc();
2697 TLB
.reserve(TL
.getFullDataSize());
2699 QualType Result
= getDerived().TransformType(TLB
, TL
);
2700 if (Result
.isNull())
2703 return TLB
.getTypeSourceInfo(SemaRef
.Context
, Result
);
2706 template<typename Derived
>
2708 TreeTransform
<Derived
>::TransformType(TypeLocBuilder
&TLB
, TypeLoc T
) {
2709 switch (T
.getTypeLocClass()) {
2710 #define ABSTRACT_TYPELOC(CLASS, PARENT)
2711 #define TYPELOC(CLASS, PARENT) \
2712 case TypeLoc::CLASS: \
2713 return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2714 #include "clang/AST/TypeLocNodes.def"
2717 llvm_unreachable("unhandled type loc!");
2721 /// FIXME: By default, this routine adds type qualifiers only to types
2722 /// that can have qualifiers, and silently suppresses those qualifiers
2723 /// that are not permitted (e.g., qualifiers on reference or function
2724 /// types). This is the right thing for template instantiation, but
2725 /// probably not for other clients.
2726 template<typename Derived
>
2728 TreeTransform
<Derived
>::TransformQualifiedType(TypeLocBuilder
&TLB
,
2729 QualifiedTypeLoc T
) {
2730 Qualifiers Quals
= T
.getType().getLocalQualifiers();
2732 QualType Result
= getDerived().TransformType(TLB
, T
.getUnqualifiedLoc());
2733 if (Result
.isNull())
2736 // Silently suppress qualifiers if the result type can't be qualified.
2737 // FIXME: this is the right thing for template instantiation, but
2738 // probably not for other clients.
2739 if (Result
->isFunctionType() || Result
->isReferenceType())
2742 if (!Quals
.empty()) {
2743 Result
= SemaRef
.BuildQualifiedType(Result
, T
.getBeginLoc(), Quals
);
2744 TLB
.push
<QualifiedTypeLoc
>(Result
);
2745 // No location information to preserve.
2751 /// \brief Transforms a type that was written in a scope specifier,
2752 /// given an object type, the results of unqualified lookup, and
2753 /// an already-instantiated prefix.
2755 /// The object type is provided iff the scope specifier qualifies the
2756 /// member of a dependent member-access expression. The prefix is
2757 /// provided iff the the scope specifier in which this appears has a
2760 /// This is private to TreeTransform.
2761 template<typename Derived
>
2763 TreeTransform
<Derived
>::TransformTypeInObjectScope(QualType T
,
2764 QualType ObjectType
,
2765 NamedDecl
*UnqualLookup
,
2766 NestedNameSpecifier
*Prefix
) {
2767 if (getDerived().AlreadyTransformed(T
))
2770 TypeSourceInfo
*TSI
=
2771 SemaRef
.Context
.getTrivialTypeSourceInfo(T
, getBaseLocation());
2773 TSI
= getDerived().TransformTypeInObjectScope(TSI
, ObjectType
,
2774 UnqualLookup
, Prefix
);
2775 if (!TSI
) return QualType();
2776 return TSI
->getType();
2779 template<typename Derived
>
2781 TreeTransform
<Derived
>::TransformTypeInObjectScope(TypeSourceInfo
*TSI
,
2782 QualType ObjectType
,
2783 NamedDecl
*UnqualLookup
,
2784 NestedNameSpecifier
*Prefix
) {
2785 // TODO: in some cases, we might be some verification to do here.
2786 if (ObjectType
.isNull())
2787 return getDerived().TransformType(TSI
);
2789 QualType T
= TSI
->getType();
2790 if (getDerived().AlreadyTransformed(T
))
2796 if (isa
<TemplateSpecializationType
>(T
)) {
2797 TemplateSpecializationTypeLoc TL
2798 = cast
<TemplateSpecializationTypeLoc
>(TSI
->getTypeLoc());
2800 TemplateName Template
=
2801 getDerived().TransformTemplateName(TL
.getTypePtr()->getTemplateName(),
2802 ObjectType
, UnqualLookup
);
2803 if (Template
.isNull()) return 0;
2805 Result
= getDerived()
2806 .TransformTemplateSpecializationType(TLB
, TL
, Template
);
2807 } else if (isa
<DependentTemplateSpecializationType
>(T
)) {
2808 DependentTemplateSpecializationTypeLoc TL
2809 = cast
<DependentTemplateSpecializationTypeLoc
>(TSI
->getTypeLoc());
2811 Result
= getDerived()
2812 .TransformDependentTemplateSpecializationType(TLB
, TL
, Prefix
);
2814 // Nothing special needs to be done for these.
2815 Result
= getDerived().TransformType(TLB
, TSI
->getTypeLoc());
2818 if (Result
.isNull()) return 0;
2819 return TLB
.getTypeSourceInfo(SemaRef
.Context
, Result
);
2822 template <class TyLoc
> static inline
2823 QualType
TransformTypeSpecType(TypeLocBuilder
&TLB
, TyLoc T
) {
2824 TyLoc NewT
= TLB
.push
<TyLoc
>(T
.getType());
2825 NewT
.setNameLoc(T
.getNameLoc());
2829 template<typename Derived
>
2830 QualType TreeTransform
<Derived
>::TransformBuiltinType(TypeLocBuilder
&TLB
,
2832 BuiltinTypeLoc NewT
= TLB
.push
<BuiltinTypeLoc
>(T
.getType());
2833 NewT
.setBuiltinLoc(T
.getBuiltinLoc());
2834 if (T
.needsExtraLocalData())
2835 NewT
.getWrittenBuiltinSpecs() = T
.getWrittenBuiltinSpecs();
2839 template<typename Derived
>
2840 QualType TreeTransform
<Derived
>::TransformComplexType(TypeLocBuilder
&TLB
,
2843 return TransformTypeSpecType(TLB
, T
);
2846 template<typename Derived
>
2847 QualType TreeTransform
<Derived
>::TransformPointerType(TypeLocBuilder
&TLB
,
2848 PointerTypeLoc TL
) {
2849 QualType PointeeType
2850 = getDerived().TransformType(TLB
, TL
.getPointeeLoc());
2851 if (PointeeType
.isNull())
2854 QualType Result
= TL
.getType();
2855 if (PointeeType
->getAs
<ObjCObjectType
>()) {
2856 // A dependent pointer type 'T *' has is being transformed such
2857 // that an Objective-C class type is being replaced for 'T'. The
2858 // resulting pointer type is an ObjCObjectPointerType, not a
2860 Result
= SemaRef
.Context
.getObjCObjectPointerType(PointeeType
);
2862 ObjCObjectPointerTypeLoc NewT
= TLB
.push
<ObjCObjectPointerTypeLoc
>(Result
);
2863 NewT
.setStarLoc(TL
.getStarLoc());
2867 if (getDerived().AlwaysRebuild() ||
2868 PointeeType
!= TL
.getPointeeLoc().getType()) {
2869 Result
= getDerived().RebuildPointerType(PointeeType
, TL
.getSigilLoc());
2870 if (Result
.isNull())
2874 PointerTypeLoc NewT
= TLB
.push
<PointerTypeLoc
>(Result
);
2875 NewT
.setSigilLoc(TL
.getSigilLoc());
2879 template<typename Derived
>
2881 TreeTransform
<Derived
>::TransformBlockPointerType(TypeLocBuilder
&TLB
,
2882 BlockPointerTypeLoc TL
) {
2883 QualType PointeeType
2884 = getDerived().TransformType(TLB
, TL
.getPointeeLoc());
2885 if (PointeeType
.isNull())
2888 QualType Result
= TL
.getType();
2889 if (getDerived().AlwaysRebuild() ||
2890 PointeeType
!= TL
.getPointeeLoc().getType()) {
2891 Result
= getDerived().RebuildBlockPointerType(PointeeType
,
2893 if (Result
.isNull())
2897 BlockPointerTypeLoc NewT
= TLB
.push
<BlockPointerTypeLoc
>(Result
);
2898 NewT
.setSigilLoc(TL
.getSigilLoc());
2902 /// Transforms a reference type. Note that somewhat paradoxically we
2903 /// don't care whether the type itself is an l-value type or an r-value
2904 /// type; we only care if the type was *written* as an l-value type
2905 /// or an r-value type.
2906 template<typename Derived
>
2908 TreeTransform
<Derived
>::TransformReferenceType(TypeLocBuilder
&TLB
,
2909 ReferenceTypeLoc TL
) {
2910 const ReferenceType
*T
= TL
.getTypePtr();
2912 // Note that this works with the pointee-as-written.
2913 QualType PointeeType
= getDerived().TransformType(TLB
, TL
.getPointeeLoc());
2914 if (PointeeType
.isNull())
2917 QualType Result
= TL
.getType();
2918 if (getDerived().AlwaysRebuild() ||
2919 PointeeType
!= T
->getPointeeTypeAsWritten()) {
2920 Result
= getDerived().RebuildReferenceType(PointeeType
,
2921 T
->isSpelledAsLValue(),
2923 if (Result
.isNull())
2927 // r-value references can be rebuilt as l-value references.
2928 ReferenceTypeLoc NewTL
;
2929 if (isa
<LValueReferenceType
>(Result
))
2930 NewTL
= TLB
.push
<LValueReferenceTypeLoc
>(Result
);
2932 NewTL
= TLB
.push
<RValueReferenceTypeLoc
>(Result
);
2933 NewTL
.setSigilLoc(TL
.getSigilLoc());
2938 template<typename Derived
>
2940 TreeTransform
<Derived
>::TransformLValueReferenceType(TypeLocBuilder
&TLB
,
2941 LValueReferenceTypeLoc TL
) {
2942 return TransformReferenceType(TLB
, TL
);
2945 template<typename Derived
>
2947 TreeTransform
<Derived
>::TransformRValueReferenceType(TypeLocBuilder
&TLB
,
2948 RValueReferenceTypeLoc TL
) {
2949 return TransformReferenceType(TLB
, TL
);
2952 template<typename Derived
>
2954 TreeTransform
<Derived
>::TransformMemberPointerType(TypeLocBuilder
&TLB
,
2955 MemberPointerTypeLoc TL
) {
2956 MemberPointerType
*T
= TL
.getTypePtr();
2958 QualType PointeeType
= getDerived().TransformType(TLB
, TL
.getPointeeLoc());
2959 if (PointeeType
.isNull())
2962 // TODO: preserve source information for this.
2964 = getDerived().TransformType(QualType(T
->getClass(), 0));
2965 if (ClassType
.isNull())
2968 QualType Result
= TL
.getType();
2969 if (getDerived().AlwaysRebuild() ||
2970 PointeeType
!= T
->getPointeeType() ||
2971 ClassType
!= QualType(T
->getClass(), 0)) {
2972 Result
= getDerived().RebuildMemberPointerType(PointeeType
, ClassType
,
2974 if (Result
.isNull())
2978 MemberPointerTypeLoc NewTL
= TLB
.push
<MemberPointerTypeLoc
>(Result
);
2979 NewTL
.setSigilLoc(TL
.getSigilLoc());
2984 template<typename Derived
>
2986 TreeTransform
<Derived
>::TransformConstantArrayType(TypeLocBuilder
&TLB
,
2987 ConstantArrayTypeLoc TL
) {
2988 ConstantArrayType
*T
= TL
.getTypePtr();
2989 QualType ElementType
= getDerived().TransformType(TLB
, TL
.getElementLoc());
2990 if (ElementType
.isNull())
2993 QualType Result
= TL
.getType();
2994 if (getDerived().AlwaysRebuild() ||
2995 ElementType
!= T
->getElementType()) {
2996 Result
= getDerived().RebuildConstantArrayType(ElementType
,
2997 T
->getSizeModifier(),
2999 T
->getIndexTypeCVRQualifiers(),
3000 TL
.getBracketsRange());
3001 if (Result
.isNull())
3005 ConstantArrayTypeLoc NewTL
= TLB
.push
<ConstantArrayTypeLoc
>(Result
);
3006 NewTL
.setLBracketLoc(TL
.getLBracketLoc());
3007 NewTL
.setRBracketLoc(TL
.getRBracketLoc());
3009 Expr
*Size
= TL
.getSizeExpr();
3011 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3012 Size
= getDerived().TransformExpr(Size
).template takeAs
<Expr
>();
3014 NewTL
.setSizeExpr(Size
);
3019 template<typename Derived
>
3020 QualType TreeTransform
<Derived
>::TransformIncompleteArrayType(
3021 TypeLocBuilder
&TLB
,
3022 IncompleteArrayTypeLoc TL
) {
3023 IncompleteArrayType
*T
= TL
.getTypePtr();
3024 QualType ElementType
= getDerived().TransformType(TLB
, TL
.getElementLoc());
3025 if (ElementType
.isNull())
3028 QualType Result
= TL
.getType();
3029 if (getDerived().AlwaysRebuild() ||
3030 ElementType
!= T
->getElementType()) {
3031 Result
= getDerived().RebuildIncompleteArrayType(ElementType
,
3032 T
->getSizeModifier(),
3033 T
->getIndexTypeCVRQualifiers(),
3034 TL
.getBracketsRange());
3035 if (Result
.isNull())
3039 IncompleteArrayTypeLoc NewTL
= TLB
.push
<IncompleteArrayTypeLoc
>(Result
);
3040 NewTL
.setLBracketLoc(TL
.getLBracketLoc());
3041 NewTL
.setRBracketLoc(TL
.getRBracketLoc());
3042 NewTL
.setSizeExpr(0);
3047 template<typename Derived
>
3049 TreeTransform
<Derived
>::TransformVariableArrayType(TypeLocBuilder
&TLB
,
3050 VariableArrayTypeLoc TL
) {
3051 VariableArrayType
*T
= TL
.getTypePtr();
3052 QualType ElementType
= getDerived().TransformType(TLB
, TL
.getElementLoc());
3053 if (ElementType
.isNull())
3056 // Array bounds are not potentially evaluated contexts
3057 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3059 ExprResult SizeResult
3060 = getDerived().TransformExpr(T
->getSizeExpr());
3061 if (SizeResult
.isInvalid())
3064 Expr
*Size
= SizeResult
.take();
3066 QualType Result
= TL
.getType();
3067 if (getDerived().AlwaysRebuild() ||
3068 ElementType
!= T
->getElementType() ||
3069 Size
!= T
->getSizeExpr()) {
3070 Result
= getDerived().RebuildVariableArrayType(ElementType
,
3071 T
->getSizeModifier(),
3073 T
->getIndexTypeCVRQualifiers(),
3074 TL
.getBracketsRange());
3075 if (Result
.isNull())
3079 VariableArrayTypeLoc NewTL
= TLB
.push
<VariableArrayTypeLoc
>(Result
);
3080 NewTL
.setLBracketLoc(TL
.getLBracketLoc());
3081 NewTL
.setRBracketLoc(TL
.getRBracketLoc());
3082 NewTL
.setSizeExpr(Size
);
3087 template<typename Derived
>
3089 TreeTransform
<Derived
>::TransformDependentSizedArrayType(TypeLocBuilder
&TLB
,
3090 DependentSizedArrayTypeLoc TL
) {
3091 DependentSizedArrayType
*T
= TL
.getTypePtr();
3092 QualType ElementType
= getDerived().TransformType(TLB
, TL
.getElementLoc());
3093 if (ElementType
.isNull())
3096 // Array bounds are not potentially evaluated contexts
3097 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3099 ExprResult SizeResult
3100 = getDerived().TransformExpr(T
->getSizeExpr());
3101 if (SizeResult
.isInvalid())
3104 Expr
*Size
= static_cast<Expr
*>(SizeResult
.get());
3106 QualType Result
= TL
.getType();
3107 if (getDerived().AlwaysRebuild() ||
3108 ElementType
!= T
->getElementType() ||
3109 Size
!= T
->getSizeExpr()) {
3110 Result
= getDerived().RebuildDependentSizedArrayType(ElementType
,
3111 T
->getSizeModifier(),
3113 T
->getIndexTypeCVRQualifiers(),
3114 TL
.getBracketsRange());
3115 if (Result
.isNull())
3118 else SizeResult
.take();
3120 // We might have any sort of array type now, but fortunately they
3121 // all have the same location layout.
3122 ArrayTypeLoc NewTL
= TLB
.push
<ArrayTypeLoc
>(Result
);
3123 NewTL
.setLBracketLoc(TL
.getLBracketLoc());
3124 NewTL
.setRBracketLoc(TL
.getRBracketLoc());
3125 NewTL
.setSizeExpr(Size
);
3130 template<typename Derived
>
3131 QualType TreeTransform
<Derived
>::TransformDependentSizedExtVectorType(
3132 TypeLocBuilder
&TLB
,
3133 DependentSizedExtVectorTypeLoc TL
) {
3134 DependentSizedExtVectorType
*T
= TL
.getTypePtr();
3136 // FIXME: ext vector locs should be nested
3137 QualType ElementType
= getDerived().TransformType(T
->getElementType());
3138 if (ElementType
.isNull())
3141 // Vector sizes are not potentially evaluated contexts
3142 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3144 ExprResult Size
= getDerived().TransformExpr(T
->getSizeExpr());
3145 if (Size
.isInvalid())
3148 QualType Result
= TL
.getType();
3149 if (getDerived().AlwaysRebuild() ||
3150 ElementType
!= T
->getElementType() ||
3151 Size
.get() != T
->getSizeExpr()) {
3152 Result
= getDerived().RebuildDependentSizedExtVectorType(ElementType
,
3154 T
->getAttributeLoc());
3155 if (Result
.isNull())
3159 // Result might be dependent or not.
3160 if (isa
<DependentSizedExtVectorType
>(Result
)) {
3161 DependentSizedExtVectorTypeLoc NewTL
3162 = TLB
.push
<DependentSizedExtVectorTypeLoc
>(Result
);
3163 NewTL
.setNameLoc(TL
.getNameLoc());
3165 ExtVectorTypeLoc NewTL
= TLB
.push
<ExtVectorTypeLoc
>(Result
);
3166 NewTL
.setNameLoc(TL
.getNameLoc());
3172 template<typename Derived
>
3173 QualType TreeTransform
<Derived
>::TransformVectorType(TypeLocBuilder
&TLB
,
3175 VectorType
*T
= TL
.getTypePtr();
3176 QualType ElementType
= getDerived().TransformType(T
->getElementType());
3177 if (ElementType
.isNull())
3180 QualType Result
= TL
.getType();
3181 if (getDerived().AlwaysRebuild() ||
3182 ElementType
!= T
->getElementType()) {
3183 Result
= getDerived().RebuildVectorType(ElementType
, T
->getNumElements(),
3184 T
->getVectorKind());
3185 if (Result
.isNull())
3189 VectorTypeLoc NewTL
= TLB
.push
<VectorTypeLoc
>(Result
);
3190 NewTL
.setNameLoc(TL
.getNameLoc());
3195 template<typename Derived
>
3196 QualType TreeTransform
<Derived
>::TransformExtVectorType(TypeLocBuilder
&TLB
,
3197 ExtVectorTypeLoc TL
) {
3198 VectorType
*T
= TL
.getTypePtr();
3199 QualType ElementType
= getDerived().TransformType(T
->getElementType());
3200 if (ElementType
.isNull())
3203 QualType Result
= TL
.getType();
3204 if (getDerived().AlwaysRebuild() ||
3205 ElementType
!= T
->getElementType()) {
3206 Result
= getDerived().RebuildExtVectorType(ElementType
,
3207 T
->getNumElements(),
3208 /*FIXME*/ SourceLocation());
3209 if (Result
.isNull())
3213 ExtVectorTypeLoc NewTL
= TLB
.push
<ExtVectorTypeLoc
>(Result
);
3214 NewTL
.setNameLoc(TL
.getNameLoc());
3219 template<typename Derived
>
3221 TreeTransform
<Derived
>::TransformFunctionTypeParam(ParmVarDecl
*OldParm
) {
3222 TypeSourceInfo
*OldDI
= OldParm
->getTypeSourceInfo();
3223 TypeSourceInfo
*NewDI
= getDerived().TransformType(OldDI
);
3230 return ParmVarDecl::Create(SemaRef
.Context
,
3231 OldParm
->getDeclContext(),
3232 OldParm
->getLocation(),
3233 OldParm
->getIdentifier(),
3236 OldParm
->getStorageClass(),
3237 OldParm
->getStorageClassAsWritten(),
3241 template<typename Derived
>
3242 bool TreeTransform
<Derived
>::
3243 TransformFunctionTypeParams(FunctionProtoTypeLoc TL
,
3244 llvm::SmallVectorImpl
<QualType
> &PTypes
,
3245 llvm::SmallVectorImpl
<ParmVarDecl
*> &PVars
) {
3246 FunctionProtoType
*T
= TL
.getTypePtr();
3248 for (unsigned i
= 0, e
= TL
.getNumArgs(); i
!= e
; ++i
) {
3249 ParmVarDecl
*OldParm
= TL
.getArg(i
);
3252 ParmVarDecl
*NewParm
;
3255 NewParm
= getDerived().TransformFunctionTypeParam(OldParm
);
3258 NewType
= NewParm
->getType();
3260 // Deal with the possibility that we don't have a parameter
3261 // declaration for this parameter.
3265 QualType OldType
= T
->getArgType(i
);
3266 NewType
= getDerived().TransformType(OldType
);
3267 if (NewType
.isNull())
3271 PTypes
.push_back(NewType
);
3272 PVars
.push_back(NewParm
);
3278 template<typename Derived
>
3280 TreeTransform
<Derived
>::TransformFunctionProtoType(TypeLocBuilder
&TLB
,
3281 FunctionProtoTypeLoc TL
) {
3282 // Transform the parameters and return type.
3284 // We instantiate in source order, with the return type first followed by
3285 // the parameters, because users tend to expect this (even if they shouldn't
3288 // When the function has a trailing return type, we instantiate the
3289 // parameters before the return type, since the return type can then refer
3290 // to the parameters themselves (via decltype, sizeof, etc.).
3292 llvm::SmallVector
<QualType
, 4> ParamTypes
;
3293 llvm::SmallVector
<ParmVarDecl
*, 4> ParamDecls
;
3294 FunctionProtoType
*T
= TL
.getTypePtr();
3296 QualType ResultType
;
3298 if (TL
.getTrailingReturn()) {
3299 if (getDerived().TransformFunctionTypeParams(TL
, ParamTypes
, ParamDecls
))
3302 ResultType
= getDerived().TransformType(TLB
, TL
.getResultLoc());
3303 if (ResultType
.isNull())
3307 ResultType
= getDerived().TransformType(TLB
, TL
.getResultLoc());
3308 if (ResultType
.isNull())
3311 if (getDerived().TransformFunctionTypeParams(TL
, ParamTypes
, ParamDecls
))
3315 QualType Result
= TL
.getType();
3316 if (getDerived().AlwaysRebuild() ||
3317 ResultType
!= T
->getResultType() ||
3318 !std::equal(T
->arg_type_begin(), T
->arg_type_end(), ParamTypes
.begin())) {
3319 Result
= getDerived().RebuildFunctionProtoType(ResultType
,
3325 if (Result
.isNull())
3329 FunctionProtoTypeLoc NewTL
= TLB
.push
<FunctionProtoTypeLoc
>(Result
);
3330 NewTL
.setLParenLoc(TL
.getLParenLoc());
3331 NewTL
.setRParenLoc(TL
.getRParenLoc());
3332 NewTL
.setTrailingReturn(TL
.getTrailingReturn());
3333 for (unsigned i
= 0, e
= NewTL
.getNumArgs(); i
!= e
; ++i
)
3334 NewTL
.setArg(i
, ParamDecls
[i
]);
3339 template<typename Derived
>
3340 QualType TreeTransform
<Derived
>::TransformFunctionNoProtoType(
3341 TypeLocBuilder
&TLB
,
3342 FunctionNoProtoTypeLoc TL
) {
3343 FunctionNoProtoType
*T
= TL
.getTypePtr();
3344 QualType ResultType
= getDerived().TransformType(TLB
, TL
.getResultLoc());
3345 if (ResultType
.isNull())
3348 QualType Result
= TL
.getType();
3349 if (getDerived().AlwaysRebuild() ||
3350 ResultType
!= T
->getResultType())
3351 Result
= getDerived().RebuildFunctionNoProtoType(ResultType
);
3353 FunctionNoProtoTypeLoc NewTL
= TLB
.push
<FunctionNoProtoTypeLoc
>(Result
);
3354 NewTL
.setLParenLoc(TL
.getLParenLoc());
3355 NewTL
.setRParenLoc(TL
.getRParenLoc());
3356 NewTL
.setTrailingReturn(false);
3361 template<typename Derived
> QualType
3362 TreeTransform
<Derived
>::TransformUnresolvedUsingType(TypeLocBuilder
&TLB
,
3363 UnresolvedUsingTypeLoc TL
) {
3364 UnresolvedUsingType
*T
= TL
.getTypePtr();
3365 Decl
*D
= getDerived().TransformDecl(TL
.getNameLoc(), T
->getDecl());
3369 QualType Result
= TL
.getType();
3370 if (getDerived().AlwaysRebuild() || D
!= T
->getDecl()) {
3371 Result
= getDerived().RebuildUnresolvedUsingType(D
);
3372 if (Result
.isNull())
3376 // We might get an arbitrary type spec type back. We should at
3377 // least always get a type spec type, though.
3378 TypeSpecTypeLoc NewTL
= TLB
.pushTypeSpec(Result
);
3379 NewTL
.setNameLoc(TL
.getNameLoc());
3384 template<typename Derived
>
3385 QualType TreeTransform
<Derived
>::TransformTypedefType(TypeLocBuilder
&TLB
,
3386 TypedefTypeLoc TL
) {
3387 TypedefType
*T
= TL
.getTypePtr();
3388 TypedefDecl
*Typedef
3389 = cast_or_null
<TypedefDecl
>(getDerived().TransformDecl(TL
.getNameLoc(),
3394 QualType Result
= TL
.getType();
3395 if (getDerived().AlwaysRebuild() ||
3396 Typedef
!= T
->getDecl()) {
3397 Result
= getDerived().RebuildTypedefType(Typedef
);
3398 if (Result
.isNull())
3402 TypedefTypeLoc NewTL
= TLB
.push
<TypedefTypeLoc
>(Result
);
3403 NewTL
.setNameLoc(TL
.getNameLoc());
3408 template<typename Derived
>
3409 QualType TreeTransform
<Derived
>::TransformTypeOfExprType(TypeLocBuilder
&TLB
,
3410 TypeOfExprTypeLoc TL
) {
3411 // typeof expressions are not potentially evaluated contexts
3412 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3414 ExprResult E
= getDerived().TransformExpr(TL
.getUnderlyingExpr());
3418 QualType Result
= TL
.getType();
3419 if (getDerived().AlwaysRebuild() ||
3420 E
.get() != TL
.getUnderlyingExpr()) {
3421 Result
= getDerived().RebuildTypeOfExprType(E
.get(), TL
.getTypeofLoc());
3422 if (Result
.isNull())
3427 TypeOfExprTypeLoc NewTL
= TLB
.push
<TypeOfExprTypeLoc
>(Result
);
3428 NewTL
.setTypeofLoc(TL
.getTypeofLoc());
3429 NewTL
.setLParenLoc(TL
.getLParenLoc());
3430 NewTL
.setRParenLoc(TL
.getRParenLoc());
3435 template<typename Derived
>
3436 QualType TreeTransform
<Derived
>::TransformTypeOfType(TypeLocBuilder
&TLB
,
3438 TypeSourceInfo
* Old_Under_TI
= TL
.getUnderlyingTInfo();
3439 TypeSourceInfo
* New_Under_TI
= getDerived().TransformType(Old_Under_TI
);
3443 QualType Result
= TL
.getType();
3444 if (getDerived().AlwaysRebuild() || New_Under_TI
!= Old_Under_TI
) {
3445 Result
= getDerived().RebuildTypeOfType(New_Under_TI
->getType());
3446 if (Result
.isNull())
3450 TypeOfTypeLoc NewTL
= TLB
.push
<TypeOfTypeLoc
>(Result
);
3451 NewTL
.setTypeofLoc(TL
.getTypeofLoc());
3452 NewTL
.setLParenLoc(TL
.getLParenLoc());
3453 NewTL
.setRParenLoc(TL
.getRParenLoc());
3454 NewTL
.setUnderlyingTInfo(New_Under_TI
);
3459 template<typename Derived
>
3460 QualType TreeTransform
<Derived
>::TransformDecltypeType(TypeLocBuilder
&TLB
,
3461 DecltypeTypeLoc TL
) {
3462 DecltypeType
*T
= TL
.getTypePtr();
3464 // decltype expressions are not potentially evaluated contexts
3465 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3467 ExprResult E
= getDerived().TransformExpr(T
->getUnderlyingExpr());
3471 QualType Result
= TL
.getType();
3472 if (getDerived().AlwaysRebuild() ||
3473 E
.get() != T
->getUnderlyingExpr()) {
3474 Result
= getDerived().RebuildDecltypeType(E
.get(), TL
.getNameLoc());
3475 if (Result
.isNull())
3480 DecltypeTypeLoc NewTL
= TLB
.push
<DecltypeTypeLoc
>(Result
);
3481 NewTL
.setNameLoc(TL
.getNameLoc());
3486 template<typename Derived
>
3487 QualType TreeTransform
<Derived
>::TransformRecordType(TypeLocBuilder
&TLB
,
3489 RecordType
*T
= TL
.getTypePtr();
3491 = cast_or_null
<RecordDecl
>(getDerived().TransformDecl(TL
.getNameLoc(),
3496 QualType Result
= TL
.getType();
3497 if (getDerived().AlwaysRebuild() ||
3498 Record
!= T
->getDecl()) {
3499 Result
= getDerived().RebuildRecordType(Record
);
3500 if (Result
.isNull())
3504 RecordTypeLoc NewTL
= TLB
.push
<RecordTypeLoc
>(Result
);
3505 NewTL
.setNameLoc(TL
.getNameLoc());
3510 template<typename Derived
>
3511 QualType TreeTransform
<Derived
>::TransformEnumType(TypeLocBuilder
&TLB
,
3513 EnumType
*T
= TL
.getTypePtr();
3515 = cast_or_null
<EnumDecl
>(getDerived().TransformDecl(TL
.getNameLoc(),
3520 QualType Result
= TL
.getType();
3521 if (getDerived().AlwaysRebuild() ||
3522 Enum
!= T
->getDecl()) {
3523 Result
= getDerived().RebuildEnumType(Enum
);
3524 if (Result
.isNull())
3528 EnumTypeLoc NewTL
= TLB
.push
<EnumTypeLoc
>(Result
);
3529 NewTL
.setNameLoc(TL
.getNameLoc());
3534 template<typename Derived
>
3535 QualType TreeTransform
<Derived
>::TransformInjectedClassNameType(
3536 TypeLocBuilder
&TLB
,
3537 InjectedClassNameTypeLoc TL
) {
3538 Decl
*D
= getDerived().TransformDecl(TL
.getNameLoc(),
3539 TL
.getTypePtr()->getDecl());
3540 if (!D
) return QualType();
3542 QualType T
= SemaRef
.Context
.getTypeDeclType(cast
<TypeDecl
>(D
));
3543 TLB
.pushTypeSpec(T
).setNameLoc(TL
.getNameLoc());
3548 template<typename Derived
>
3549 QualType TreeTransform
<Derived
>::TransformTemplateTypeParmType(
3550 TypeLocBuilder
&TLB
,
3551 TemplateTypeParmTypeLoc TL
) {
3552 return TransformTypeSpecType(TLB
, TL
);
3555 template<typename Derived
>
3556 QualType TreeTransform
<Derived
>::TransformSubstTemplateTypeParmType(
3557 TypeLocBuilder
&TLB
,
3558 SubstTemplateTypeParmTypeLoc TL
) {
3559 return TransformTypeSpecType(TLB
, TL
);
3562 template<typename Derived
>
3563 QualType TreeTransform
<Derived
>::TransformTemplateSpecializationType(
3564 TypeLocBuilder
&TLB
,
3565 TemplateSpecializationTypeLoc TL
) {
3566 const TemplateSpecializationType
*T
= TL
.getTypePtr();
3568 TemplateName Template
3569 = getDerived().TransformTemplateName(T
->getTemplateName());
3570 if (Template
.isNull())
3573 return getDerived().TransformTemplateSpecializationType(TLB
, TL
, Template
);
3577 /// \brief Simple iterator that traverses the template arguments in a
3578 /// container that provides a \c getArgLoc() member function.
3580 /// This iterator is intended to be used with the iterator form of
3581 /// \c TreeTransform<Derived>::TransformTemplateArguments().
3582 template<typename ArgLocContainer
>
3583 class TemplateArgumentLocContainerIterator
{
3584 ArgLocContainer
*Container
;
3588 typedef TemplateArgumentLoc value_type
;
3589 typedef TemplateArgumentLoc reference
;
3590 typedef int difference_type
;
3591 typedef std::input_iterator_tag iterator_category
;
3594 TemplateArgumentLoc Arg
;
3597 explicit pointer(TemplateArgumentLoc Arg
) : Arg(Arg
) { }
3599 const TemplateArgumentLoc
*operator->() const {
3605 TemplateArgumentLocContainerIterator() {}
3607 TemplateArgumentLocContainerIterator(ArgLocContainer
&Container
,
3609 : Container(&Container
), Index(Index
) { }
3611 TemplateArgumentLocContainerIterator
&operator++() {
3616 TemplateArgumentLocContainerIterator
operator++(int) {
3617 TemplateArgumentLocContainerIterator
Old(*this);
3622 TemplateArgumentLoc
operator*() const {
3623 return Container
->getArgLoc(Index
);
3626 pointer
operator->() const {
3627 return pointer(Container
->getArgLoc(Index
));
3630 friend bool operator==(const TemplateArgumentLocContainerIterator
&X
,
3631 TemplateArgumentLocContainerIterator
&Y
) {
3632 return X
.Container
== Y
.Container
&& X
.Index
== Y
.Index
;
3635 friend bool operator!=(const TemplateArgumentLocContainerIterator
&X
,
3636 TemplateArgumentLocContainerIterator
&Y
) {
3643 template <typename Derived
>
3644 QualType TreeTransform
<Derived
>::TransformTemplateSpecializationType(
3645 TypeLocBuilder
&TLB
,
3646 TemplateSpecializationTypeLoc TL
,
3647 TemplateName Template
) {
3648 TemplateArgumentListInfo NewTemplateArgs
;
3649 NewTemplateArgs
.setLAngleLoc(TL
.getLAngleLoc());
3650 NewTemplateArgs
.setRAngleLoc(TL
.getRAngleLoc());
3651 typedef TemplateArgumentLocContainerIterator
<TemplateSpecializationTypeLoc
>
3653 if (getDerived().TransformTemplateArguments(ArgIterator(TL
, 0),
3654 ArgIterator(TL
, TL
.getNumArgs()),
3658 // FIXME: maybe don't rebuild if all the template arguments are the same.
3661 getDerived().RebuildTemplateSpecializationType(Template
,
3662 TL
.getTemplateNameLoc(),
3665 if (!Result
.isNull()) {
3666 TemplateSpecializationTypeLoc NewTL
3667 = TLB
.push
<TemplateSpecializationTypeLoc
>(Result
);
3668 NewTL
.setTemplateNameLoc(TL
.getTemplateNameLoc());
3669 NewTL
.setLAngleLoc(TL
.getLAngleLoc());
3670 NewTL
.setRAngleLoc(TL
.getRAngleLoc());
3671 for (unsigned i
= 0, e
= NewTemplateArgs
.size(); i
!= e
; ++i
)
3672 NewTL
.setArgLocInfo(i
, NewTemplateArgs
[i
].getLocInfo());
3678 template<typename Derived
>
3680 TreeTransform
<Derived
>::TransformElaboratedType(TypeLocBuilder
&TLB
,
3681 ElaboratedTypeLoc TL
) {
3682 ElaboratedType
*T
= TL
.getTypePtr();
3684 NestedNameSpecifier
*NNS
= 0;
3685 // NOTE: the qualifier in an ElaboratedType is optional.
3686 if (T
->getQualifier() != 0) {
3687 NNS
= getDerived().TransformNestedNameSpecifier(T
->getQualifier(),
3688 TL
.getQualifierRange());
3693 QualType NamedT
= getDerived().TransformType(TLB
, TL
.getNamedTypeLoc());
3694 if (NamedT
.isNull())
3697 QualType Result
= TL
.getType();
3698 if (getDerived().AlwaysRebuild() ||
3699 NNS
!= T
->getQualifier() ||
3700 NamedT
!= T
->getNamedType()) {
3701 Result
= getDerived().RebuildElaboratedType(TL
.getKeywordLoc(),
3702 T
->getKeyword(), NNS
, NamedT
);
3703 if (Result
.isNull())
3707 ElaboratedTypeLoc NewTL
= TLB
.push
<ElaboratedTypeLoc
>(Result
);
3708 NewTL
.setKeywordLoc(TL
.getKeywordLoc());
3709 NewTL
.setQualifierRange(TL
.getQualifierRange());
3714 template<typename Derived
>
3716 TreeTransform
<Derived
>::TransformParenType(TypeLocBuilder
&TLB
,
3718 QualType Inner
= getDerived().TransformType(TLB
, TL
.getInnerLoc());
3722 QualType Result
= TL
.getType();
3723 if (getDerived().AlwaysRebuild() ||
3724 Inner
!= TL
.getInnerLoc().getType()) {
3725 Result
= getDerived().RebuildParenType(Inner
);
3726 if (Result
.isNull())
3730 ParenTypeLoc NewTL
= TLB
.push
<ParenTypeLoc
>(Result
);
3731 NewTL
.setLParenLoc(TL
.getLParenLoc());
3732 NewTL
.setRParenLoc(TL
.getRParenLoc());
3736 template<typename Derived
>
3737 QualType TreeTransform
<Derived
>::TransformDependentNameType(TypeLocBuilder
&TLB
,
3738 DependentNameTypeLoc TL
) {
3739 DependentNameType
*T
= TL
.getTypePtr();
3741 NestedNameSpecifier
*NNS
3742 = getDerived().TransformNestedNameSpecifier(T
->getQualifier(),
3743 TL
.getQualifierRange());
3748 = getDerived().RebuildDependentNameType(T
->getKeyword(), NNS
,
3751 TL
.getQualifierRange(),
3753 if (Result
.isNull())
3756 if (const ElaboratedType
* ElabT
= Result
->getAs
<ElaboratedType
>()) {
3757 QualType NamedT
= ElabT
->getNamedType();
3758 TLB
.pushTypeSpec(NamedT
).setNameLoc(TL
.getNameLoc());
3760 ElaboratedTypeLoc NewTL
= TLB
.push
<ElaboratedTypeLoc
>(Result
);
3761 NewTL
.setKeywordLoc(TL
.getKeywordLoc());
3762 NewTL
.setQualifierRange(TL
.getQualifierRange());
3764 DependentNameTypeLoc NewTL
= TLB
.push
<DependentNameTypeLoc
>(Result
);
3765 NewTL
.setKeywordLoc(TL
.getKeywordLoc());
3766 NewTL
.setQualifierRange(TL
.getQualifierRange());
3767 NewTL
.setNameLoc(TL
.getNameLoc());
3772 template<typename Derived
>
3773 QualType TreeTransform
<Derived
>::
3774 TransformDependentTemplateSpecializationType(TypeLocBuilder
&TLB
,
3775 DependentTemplateSpecializationTypeLoc TL
) {
3776 DependentTemplateSpecializationType
*T
= TL
.getTypePtr();
3778 NestedNameSpecifier
*NNS
3779 = getDerived().TransformNestedNameSpecifier(T
->getQualifier(),
3780 TL
.getQualifierRange());
3785 .TransformDependentTemplateSpecializationType(TLB
, TL
, NNS
);
3788 template<typename Derived
>
3789 QualType TreeTransform
<Derived
>::
3790 TransformDependentTemplateSpecializationType(TypeLocBuilder
&TLB
,
3791 DependentTemplateSpecializationTypeLoc TL
,
3792 NestedNameSpecifier
*NNS
) {
3793 DependentTemplateSpecializationType
*T
= TL
.getTypePtr();
3795 TemplateArgumentListInfo NewTemplateArgs
;
3796 NewTemplateArgs
.setLAngleLoc(TL
.getLAngleLoc());
3797 NewTemplateArgs
.setRAngleLoc(TL
.getRAngleLoc());
3799 typedef TemplateArgumentLocContainerIterator
<
3800 DependentTemplateSpecializationTypeLoc
> ArgIterator
;
3801 if (getDerived().TransformTemplateArguments(ArgIterator(TL
, 0),
3802 ArgIterator(TL
, TL
.getNumArgs()),
3807 = getDerived().RebuildDependentTemplateSpecializationType(T
->getKeyword(),
3809 TL
.getQualifierRange(),
3813 if (Result
.isNull())
3816 if (const ElaboratedType
*ElabT
= dyn_cast
<ElaboratedType
>(Result
)) {
3817 QualType NamedT
= ElabT
->getNamedType();
3819 // Copy information relevant to the template specialization.
3820 TemplateSpecializationTypeLoc NamedTL
3821 = TLB
.push
<TemplateSpecializationTypeLoc
>(NamedT
);
3822 NamedTL
.setLAngleLoc(TL
.getLAngleLoc());
3823 NamedTL
.setRAngleLoc(TL
.getRAngleLoc());
3824 for (unsigned I
= 0, E
= TL
.getNumArgs(); I
!= E
; ++I
)
3825 NamedTL
.setArgLocInfo(I
, TL
.getArgLocInfo(I
));
3827 // Copy information relevant to the elaborated type.
3828 ElaboratedTypeLoc NewTL
= TLB
.push
<ElaboratedTypeLoc
>(Result
);
3829 NewTL
.setKeywordLoc(TL
.getKeywordLoc());
3830 NewTL
.setQualifierRange(TL
.getQualifierRange());
3832 TypeLoc
NewTL(Result
, TL
.getOpaqueData());
3833 TLB
.pushFullCopy(NewTL
);
3838 template<typename Derived
>
3839 QualType TreeTransform
<Derived
>::TransformPackExpansionType(TypeLocBuilder
&TLB
,
3840 PackExpansionTypeLoc TL
) {
3841 // FIXME: Implement!
3842 getSema().Diag(TL
.getEllipsisLoc(),
3843 diag::err_pack_expansion_instantiation_unsupported
);
3847 template<typename Derived
>
3849 TreeTransform
<Derived
>::TransformObjCInterfaceType(TypeLocBuilder
&TLB
,
3850 ObjCInterfaceTypeLoc TL
) {
3851 // ObjCInterfaceType is never dependent.
3852 TLB
.pushFullCopy(TL
);
3853 return TL
.getType();
3856 template<typename Derived
>
3858 TreeTransform
<Derived
>::TransformObjCObjectType(TypeLocBuilder
&TLB
,
3859 ObjCObjectTypeLoc TL
) {
3860 // ObjCObjectType is never dependent.
3861 TLB
.pushFullCopy(TL
);
3862 return TL
.getType();
3865 template<typename Derived
>
3867 TreeTransform
<Derived
>::TransformObjCObjectPointerType(TypeLocBuilder
&TLB
,
3868 ObjCObjectPointerTypeLoc TL
) {
3869 // ObjCObjectPointerType is never dependent.
3870 TLB
.pushFullCopy(TL
);
3871 return TL
.getType();
3874 //===----------------------------------------------------------------------===//
3875 // Statement transformation
3876 //===----------------------------------------------------------------------===//
3877 template<typename Derived
>
3879 TreeTransform
<Derived
>::TransformNullStmt(NullStmt
*S
) {
3880 return SemaRef
.Owned(S
);
3883 template<typename Derived
>
3885 TreeTransform
<Derived
>::TransformCompoundStmt(CompoundStmt
*S
) {
3886 return getDerived().TransformCompoundStmt(S
, false);
3889 template<typename Derived
>
3891 TreeTransform
<Derived
>::TransformCompoundStmt(CompoundStmt
*S
,
3893 bool SubStmtInvalid
= false;
3894 bool SubStmtChanged
= false;
3895 ASTOwningVector
<Stmt
*> Statements(getSema());
3896 for (CompoundStmt::body_iterator B
= S
->body_begin(), BEnd
= S
->body_end();
3898 StmtResult Result
= getDerived().TransformStmt(*B
);
3899 if (Result
.isInvalid()) {
3900 // Immediately fail if this was a DeclStmt, since it's very
3901 // likely that this will cause problems for future statements.
3902 if (isa
<DeclStmt
>(*B
))
3905 // Otherwise, just keep processing substatements and fail later.
3906 SubStmtInvalid
= true;
3910 SubStmtChanged
= SubStmtChanged
|| Result
.get() != *B
;
3911 Statements
.push_back(Result
.takeAs
<Stmt
>());
3917 if (!getDerived().AlwaysRebuild() &&
3919 return SemaRef
.Owned(S
);
3921 return getDerived().RebuildCompoundStmt(S
->getLBracLoc(),
3922 move_arg(Statements
),
3927 template<typename Derived
>
3929 TreeTransform
<Derived
>::TransformCaseStmt(CaseStmt
*S
) {
3930 ExprResult LHS
, RHS
;
3932 // The case value expressions are not potentially evaluated.
3933 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
3935 // Transform the left-hand case value.
3936 LHS
= getDerived().TransformExpr(S
->getLHS());
3937 if (LHS
.isInvalid())
3940 // Transform the right-hand case value (for the GNU case-range extension).
3941 RHS
= getDerived().TransformExpr(S
->getRHS());
3942 if (RHS
.isInvalid())
3946 // Build the case statement.
3947 // Case statements are always rebuilt so that they will attached to their
3948 // transformed switch statement.
3949 StmtResult Case
= getDerived().RebuildCaseStmt(S
->getCaseLoc(),
3951 S
->getEllipsisLoc(),
3954 if (Case
.isInvalid())
3957 // Transform the statement following the case
3958 StmtResult SubStmt
= getDerived().TransformStmt(S
->getSubStmt());
3959 if (SubStmt
.isInvalid())
3962 // Attach the body to the case statement
3963 return getDerived().RebuildCaseStmtBody(Case
.get(), SubStmt
.get());
3966 template<typename Derived
>
3968 TreeTransform
<Derived
>::TransformDefaultStmt(DefaultStmt
*S
) {
3969 // Transform the statement following the default case
3970 StmtResult SubStmt
= getDerived().TransformStmt(S
->getSubStmt());
3971 if (SubStmt
.isInvalid())
3974 // Default statements are always rebuilt
3975 return getDerived().RebuildDefaultStmt(S
->getDefaultLoc(), S
->getColonLoc(),
3979 template<typename Derived
>
3981 TreeTransform
<Derived
>::TransformLabelStmt(LabelStmt
*S
) {
3982 StmtResult SubStmt
= getDerived().TransformStmt(S
->getSubStmt());
3983 if (SubStmt
.isInvalid())
3986 // FIXME: Pass the real colon location in.
3987 SourceLocation ColonLoc
= SemaRef
.PP
.getLocForEndOfToken(S
->getIdentLoc());
3988 return getDerived().RebuildLabelStmt(S
->getIdentLoc(), S
->getID(), ColonLoc
,
3989 SubStmt
.get(), S
->HasUnusedAttribute());
3992 template<typename Derived
>
3994 TreeTransform
<Derived
>::TransformIfStmt(IfStmt
*S
) {
3995 // Transform the condition
3997 VarDecl
*ConditionVar
= 0;
3998 if (S
->getConditionVariable()) {
4000 = cast_or_null
<VarDecl
>(
4001 getDerived().TransformDefinition(
4002 S
->getConditionVariable()->getLocation(),
4003 S
->getConditionVariable()));
4007 Cond
= getDerived().TransformExpr(S
->getCond());
4009 if (Cond
.isInvalid())
4012 // Convert the condition to a boolean value.
4014 ExprResult CondE
= getSema().ActOnBooleanCondition(0, S
->getIfLoc(),
4016 if (CondE
.isInvalid())
4023 Sema::FullExprArg
FullCond(getSema().MakeFullExpr(Cond
.take()));
4024 if (!S
->getConditionVariable() && S
->getCond() && !FullCond
.get())
4027 // Transform the "then" branch.
4028 StmtResult Then
= getDerived().TransformStmt(S
->getThen());
4029 if (Then
.isInvalid())
4032 // Transform the "else" branch.
4033 StmtResult Else
= getDerived().TransformStmt(S
->getElse());
4034 if (Else
.isInvalid())
4037 if (!getDerived().AlwaysRebuild() &&
4038 FullCond
.get() == S
->getCond() &&
4039 ConditionVar
== S
->getConditionVariable() &&
4040 Then
.get() == S
->getThen() &&
4041 Else
.get() == S
->getElse())
4042 return SemaRef
.Owned(S
);
4044 return getDerived().RebuildIfStmt(S
->getIfLoc(), FullCond
, ConditionVar
,
4046 S
->getElseLoc(), Else
.get());
4049 template<typename Derived
>
4051 TreeTransform
<Derived
>::TransformSwitchStmt(SwitchStmt
*S
) {
4052 // Transform the condition.
4054 VarDecl
*ConditionVar
= 0;
4055 if (S
->getConditionVariable()) {
4057 = cast_or_null
<VarDecl
>(
4058 getDerived().TransformDefinition(
4059 S
->getConditionVariable()->getLocation(),
4060 S
->getConditionVariable()));
4064 Cond
= getDerived().TransformExpr(S
->getCond());
4066 if (Cond
.isInvalid())
4070 // Rebuild the switch statement.
4072 = getDerived().RebuildSwitchStmtStart(S
->getSwitchLoc(), Cond
.get(),
4074 if (Switch
.isInvalid())
4077 // Transform the body of the switch statement.
4078 StmtResult Body
= getDerived().TransformStmt(S
->getBody());
4079 if (Body
.isInvalid())
4082 // Complete the switch statement.
4083 return getDerived().RebuildSwitchStmtBody(S
->getSwitchLoc(), Switch
.get(),
4087 template<typename Derived
>
4089 TreeTransform
<Derived
>::TransformWhileStmt(WhileStmt
*S
) {
4090 // Transform the condition
4092 VarDecl
*ConditionVar
= 0;
4093 if (S
->getConditionVariable()) {
4095 = cast_or_null
<VarDecl
>(
4096 getDerived().TransformDefinition(
4097 S
->getConditionVariable()->getLocation(),
4098 S
->getConditionVariable()));
4102 Cond
= getDerived().TransformExpr(S
->getCond());
4104 if (Cond
.isInvalid())
4108 // Convert the condition to a boolean value.
4109 ExprResult CondE
= getSema().ActOnBooleanCondition(0, S
->getWhileLoc(),
4111 if (CondE
.isInvalid())
4117 Sema::FullExprArg
FullCond(getSema().MakeFullExpr(Cond
.take()));
4118 if (!S
->getConditionVariable() && S
->getCond() && !FullCond
.get())
4121 // Transform the body
4122 StmtResult Body
= getDerived().TransformStmt(S
->getBody());
4123 if (Body
.isInvalid())
4126 if (!getDerived().AlwaysRebuild() &&
4127 FullCond
.get() == S
->getCond() &&
4128 ConditionVar
== S
->getConditionVariable() &&
4129 Body
.get() == S
->getBody())
4132 return getDerived().RebuildWhileStmt(S
->getWhileLoc(), FullCond
,
4133 ConditionVar
, Body
.get());
4136 template<typename Derived
>
4138 TreeTransform
<Derived
>::TransformDoStmt(DoStmt
*S
) {
4139 // Transform the body
4140 StmtResult Body
= getDerived().TransformStmt(S
->getBody());
4141 if (Body
.isInvalid())
4144 // Transform the condition
4145 ExprResult Cond
= getDerived().TransformExpr(S
->getCond());
4146 if (Cond
.isInvalid())
4149 if (!getDerived().AlwaysRebuild() &&
4150 Cond
.get() == S
->getCond() &&
4151 Body
.get() == S
->getBody())
4152 return SemaRef
.Owned(S
);
4154 return getDerived().RebuildDoStmt(S
->getDoLoc(), Body
.get(), S
->getWhileLoc(),
4155 /*FIXME:*/S
->getWhileLoc(), Cond
.get(),
4159 template<typename Derived
>
4161 TreeTransform
<Derived
>::TransformForStmt(ForStmt
*S
) {
4162 // Transform the initialization statement
4163 StmtResult Init
= getDerived().TransformStmt(S
->getInit());
4164 if (Init
.isInvalid())
4167 // Transform the condition
4169 VarDecl
*ConditionVar
= 0;
4170 if (S
->getConditionVariable()) {
4172 = cast_or_null
<VarDecl
>(
4173 getDerived().TransformDefinition(
4174 S
->getConditionVariable()->getLocation(),
4175 S
->getConditionVariable()));
4179 Cond
= getDerived().TransformExpr(S
->getCond());
4181 if (Cond
.isInvalid())
4185 // Convert the condition to a boolean value.
4186 ExprResult CondE
= getSema().ActOnBooleanCondition(0, S
->getForLoc(),
4188 if (CondE
.isInvalid())
4195 Sema::FullExprArg
FullCond(getSema().MakeFullExpr(Cond
.take()));
4196 if (!S
->getConditionVariable() && S
->getCond() && !FullCond
.get())
4199 // Transform the increment
4200 ExprResult Inc
= getDerived().TransformExpr(S
->getInc());
4201 if (Inc
.isInvalid())
4204 Sema::FullExprArg
FullInc(getSema().MakeFullExpr(Inc
.get()));
4205 if (S
->getInc() && !FullInc
.get())
4208 // Transform the body
4209 StmtResult Body
= getDerived().TransformStmt(S
->getBody());
4210 if (Body
.isInvalid())
4213 if (!getDerived().AlwaysRebuild() &&
4214 Init
.get() == S
->getInit() &&
4215 FullCond
.get() == S
->getCond() &&
4216 Inc
.get() == S
->getInc() &&
4217 Body
.get() == S
->getBody())
4218 return SemaRef
.Owned(S
);
4220 return getDerived().RebuildForStmt(S
->getForLoc(), S
->getLParenLoc(),
4221 Init
.get(), FullCond
, ConditionVar
,
4222 FullInc
, S
->getRParenLoc(), Body
.get());
4225 template<typename Derived
>
4227 TreeTransform
<Derived
>::TransformGotoStmt(GotoStmt
*S
) {
4228 // Goto statements must always be rebuilt, to resolve the label.
4229 return getDerived().RebuildGotoStmt(S
->getGotoLoc(), S
->getLabelLoc(),
4233 template<typename Derived
>
4235 TreeTransform
<Derived
>::TransformIndirectGotoStmt(IndirectGotoStmt
*S
) {
4236 ExprResult Target
= getDerived().TransformExpr(S
->getTarget());
4237 if (Target
.isInvalid())
4240 if (!getDerived().AlwaysRebuild() &&
4241 Target
.get() == S
->getTarget())
4242 return SemaRef
.Owned(S
);
4244 return getDerived().RebuildIndirectGotoStmt(S
->getGotoLoc(), S
->getStarLoc(),
4248 template<typename Derived
>
4250 TreeTransform
<Derived
>::TransformContinueStmt(ContinueStmt
*S
) {
4251 return SemaRef
.Owned(S
);
4254 template<typename Derived
>
4256 TreeTransform
<Derived
>::TransformBreakStmt(BreakStmt
*S
) {
4257 return SemaRef
.Owned(S
);
4260 template<typename Derived
>
4262 TreeTransform
<Derived
>::TransformReturnStmt(ReturnStmt
*S
) {
4263 ExprResult Result
= getDerived().TransformExpr(S
->getRetValue());
4264 if (Result
.isInvalid())
4267 // FIXME: We always rebuild the return statement because there is no way
4268 // to tell whether the return type of the function has changed.
4269 return getDerived().RebuildReturnStmt(S
->getReturnLoc(), Result
.get());
4272 template<typename Derived
>
4274 TreeTransform
<Derived
>::TransformDeclStmt(DeclStmt
*S
) {
4275 bool DeclChanged
= false;
4276 llvm::SmallVector
<Decl
*, 4> Decls
;
4277 for (DeclStmt::decl_iterator D
= S
->decl_begin(), DEnd
= S
->decl_end();
4279 Decl
*Transformed
= getDerived().TransformDefinition((*D
)->getLocation(),
4284 if (Transformed
!= *D
)
4287 Decls
.push_back(Transformed
);
4290 if (!getDerived().AlwaysRebuild() && !DeclChanged
)
4291 return SemaRef
.Owned(S
);
4293 return getDerived().RebuildDeclStmt(Decls
.data(), Decls
.size(),
4294 S
->getStartLoc(), S
->getEndLoc());
4297 template<typename Derived
>
4299 TreeTransform
<Derived
>::TransformSwitchCase(SwitchCase
*S
) {
4300 assert(false && "SwitchCase is abstract and cannot be transformed");
4301 return SemaRef
.Owned(S
);
4304 template<typename Derived
>
4306 TreeTransform
<Derived
>::TransformAsmStmt(AsmStmt
*S
) {
4308 ASTOwningVector
<Expr
*> Constraints(getSema());
4309 ASTOwningVector
<Expr
*> Exprs(getSema());
4310 llvm::SmallVector
<IdentifierInfo
*, 4> Names
;
4312 ExprResult AsmString
;
4313 ASTOwningVector
<Expr
*> Clobbers(getSema());
4315 bool ExprsChanged
= false;
4317 // Go through the outputs.
4318 for (unsigned I
= 0, E
= S
->getNumOutputs(); I
!= E
; ++I
) {
4319 Names
.push_back(S
->getOutputIdentifier(I
));
4321 // No need to transform the constraint literal.
4322 Constraints
.push_back(S
->getOutputConstraintLiteral(I
));
4324 // Transform the output expr.
4325 Expr
*OutputExpr
= S
->getOutputExpr(I
);
4326 ExprResult Result
= getDerived().TransformExpr(OutputExpr
);
4327 if (Result
.isInvalid())
4330 ExprsChanged
|= Result
.get() != OutputExpr
;
4332 Exprs
.push_back(Result
.get());
4335 // Go through the inputs.
4336 for (unsigned I
= 0, E
= S
->getNumInputs(); I
!= E
; ++I
) {
4337 Names
.push_back(S
->getInputIdentifier(I
));
4339 // No need to transform the constraint literal.
4340 Constraints
.push_back(S
->getInputConstraintLiteral(I
));
4342 // Transform the input expr.
4343 Expr
*InputExpr
= S
->getInputExpr(I
);
4344 ExprResult Result
= getDerived().TransformExpr(InputExpr
);
4345 if (Result
.isInvalid())
4348 ExprsChanged
|= Result
.get() != InputExpr
;
4350 Exprs
.push_back(Result
.get());
4353 if (!getDerived().AlwaysRebuild() && !ExprsChanged
)
4354 return SemaRef
.Owned(S
);
4356 // Go through the clobbers.
4357 for (unsigned I
= 0, E
= S
->getNumClobbers(); I
!= E
; ++I
)
4358 Clobbers
.push_back(S
->getClobber(I
));
4360 // No need to transform the asm string literal.
4361 AsmString
= SemaRef
.Owned(S
->getAsmString());
4363 return getDerived().RebuildAsmStmt(S
->getAsmLoc(),
4369 move_arg(Constraints
),
4378 template<typename Derived
>
4380 TreeTransform
<Derived
>::TransformObjCAtTryStmt(ObjCAtTryStmt
*S
) {
4381 // Transform the body of the @try.
4382 StmtResult TryBody
= getDerived().TransformStmt(S
->getTryBody());
4383 if (TryBody
.isInvalid())
4386 // Transform the @catch statements (if present).
4387 bool AnyCatchChanged
= false;
4388 ASTOwningVector
<Stmt
*> CatchStmts(SemaRef
);
4389 for (unsigned I
= 0, N
= S
->getNumCatchStmts(); I
!= N
; ++I
) {
4390 StmtResult Catch
= getDerived().TransformStmt(S
->getCatchStmt(I
));
4391 if (Catch
.isInvalid())
4393 if (Catch
.get() != S
->getCatchStmt(I
))
4394 AnyCatchChanged
= true;
4395 CatchStmts
.push_back(Catch
.release());
4398 // Transform the @finally statement (if present).
4400 if (S
->getFinallyStmt()) {
4401 Finally
= getDerived().TransformStmt(S
->getFinallyStmt());
4402 if (Finally
.isInvalid())
4406 // If nothing changed, just retain this statement.
4407 if (!getDerived().AlwaysRebuild() &&
4408 TryBody
.get() == S
->getTryBody() &&
4410 Finally
.get() == S
->getFinallyStmt())
4411 return SemaRef
.Owned(S
);
4413 // Build a new statement.
4414 return getDerived().RebuildObjCAtTryStmt(S
->getAtTryLoc(), TryBody
.get(),
4415 move_arg(CatchStmts
), Finally
.get());
4418 template<typename Derived
>
4420 TreeTransform
<Derived
>::TransformObjCAtCatchStmt(ObjCAtCatchStmt
*S
) {
4421 // Transform the @catch parameter, if there is one.
4423 if (VarDecl
*FromVar
= S
->getCatchParamDecl()) {
4424 TypeSourceInfo
*TSInfo
= 0;
4425 if (FromVar
->getTypeSourceInfo()) {
4426 TSInfo
= getDerived().TransformType(FromVar
->getTypeSourceInfo());
4433 T
= TSInfo
->getType();
4435 T
= getDerived().TransformType(FromVar
->getType());
4440 Var
= getDerived().RebuildObjCExceptionDecl(FromVar
, TSInfo
, T
);
4445 StmtResult Body
= getDerived().TransformStmt(S
->getCatchBody());
4446 if (Body
.isInvalid())
4449 return getDerived().RebuildObjCAtCatchStmt(S
->getAtCatchLoc(),
4454 template<typename Derived
>
4456 TreeTransform
<Derived
>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt
*S
) {
4457 // Transform the body.
4458 StmtResult Body
= getDerived().TransformStmt(S
->getFinallyBody());
4459 if (Body
.isInvalid())
4462 // If nothing changed, just retain this statement.
4463 if (!getDerived().AlwaysRebuild() &&
4464 Body
.get() == S
->getFinallyBody())
4465 return SemaRef
.Owned(S
);
4467 // Build a new statement.
4468 return getDerived().RebuildObjCAtFinallyStmt(S
->getAtFinallyLoc(),
4472 template<typename Derived
>
4474 TreeTransform
<Derived
>::TransformObjCAtThrowStmt(ObjCAtThrowStmt
*S
) {
4476 if (S
->getThrowExpr()) {
4477 Operand
= getDerived().TransformExpr(S
->getThrowExpr());
4478 if (Operand
.isInvalid())
4482 if (!getDerived().AlwaysRebuild() &&
4483 Operand
.get() == S
->getThrowExpr())
4484 return getSema().Owned(S
);
4486 return getDerived().RebuildObjCAtThrowStmt(S
->getThrowLoc(), Operand
.get());
4489 template<typename Derived
>
4491 TreeTransform
<Derived
>::TransformObjCAtSynchronizedStmt(
4492 ObjCAtSynchronizedStmt
*S
) {
4493 // Transform the object we are locking.
4494 ExprResult Object
= getDerived().TransformExpr(S
->getSynchExpr());
4495 if (Object
.isInvalid())
4498 // Transform the body.
4499 StmtResult Body
= getDerived().TransformStmt(S
->getSynchBody());
4500 if (Body
.isInvalid())
4503 // If nothing change, just retain the current statement.
4504 if (!getDerived().AlwaysRebuild() &&
4505 Object
.get() == S
->getSynchExpr() &&
4506 Body
.get() == S
->getSynchBody())
4507 return SemaRef
.Owned(S
);
4509 // Build a new statement.
4510 return getDerived().RebuildObjCAtSynchronizedStmt(S
->getAtSynchronizedLoc(),
4511 Object
.get(), Body
.get());
4514 template<typename Derived
>
4516 TreeTransform
<Derived
>::TransformObjCForCollectionStmt(
4517 ObjCForCollectionStmt
*S
) {
4518 // Transform the element statement.
4519 StmtResult Element
= getDerived().TransformStmt(S
->getElement());
4520 if (Element
.isInvalid())
4523 // Transform the collection expression.
4524 ExprResult Collection
= getDerived().TransformExpr(S
->getCollection());
4525 if (Collection
.isInvalid())
4528 // Transform the body.
4529 StmtResult Body
= getDerived().TransformStmt(S
->getBody());
4530 if (Body
.isInvalid())
4533 // If nothing changed, just retain this statement.
4534 if (!getDerived().AlwaysRebuild() &&
4535 Element
.get() == S
->getElement() &&
4536 Collection
.get() == S
->getCollection() &&
4537 Body
.get() == S
->getBody())
4538 return SemaRef
.Owned(S
);
4540 // Build a new statement.
4541 return getDerived().RebuildObjCForCollectionStmt(S
->getForLoc(),
4542 /*FIXME:*/S
->getForLoc(),
4550 template<typename Derived
>
4552 TreeTransform
<Derived
>::TransformCXXCatchStmt(CXXCatchStmt
*S
) {
4553 // Transform the exception declaration, if any.
4555 if (S
->getExceptionDecl()) {
4556 VarDecl
*ExceptionDecl
= S
->getExceptionDecl();
4557 TypeSourceInfo
*T
= getDerived().TransformType(
4558 ExceptionDecl
->getTypeSourceInfo());
4562 Var
= getDerived().RebuildExceptionDecl(ExceptionDecl
, T
,
4563 ExceptionDecl
->getIdentifier(),
4564 ExceptionDecl
->getLocation());
4565 if (!Var
|| Var
->isInvalidDecl())
4569 // Transform the actual exception handler.
4570 StmtResult Handler
= getDerived().TransformStmt(S
->getHandlerBlock());
4571 if (Handler
.isInvalid())
4574 if (!getDerived().AlwaysRebuild() &&
4576 Handler
.get() == S
->getHandlerBlock())
4577 return SemaRef
.Owned(S
);
4579 return getDerived().RebuildCXXCatchStmt(S
->getCatchLoc(),
4584 template<typename Derived
>
4586 TreeTransform
<Derived
>::TransformCXXTryStmt(CXXTryStmt
*S
) {
4587 // Transform the try block itself.
4589 = getDerived().TransformCompoundStmt(S
->getTryBlock());
4590 if (TryBlock
.isInvalid())
4593 // Transform the handlers.
4594 bool HandlerChanged
= false;
4595 ASTOwningVector
<Stmt
*> Handlers(SemaRef
);
4596 for (unsigned I
= 0, N
= S
->getNumHandlers(); I
!= N
; ++I
) {
4598 = getDerived().TransformCXXCatchStmt(S
->getHandler(I
));
4599 if (Handler
.isInvalid())
4602 HandlerChanged
= HandlerChanged
|| Handler
.get() != S
->getHandler(I
);
4603 Handlers
.push_back(Handler
.takeAs
<Stmt
>());
4606 if (!getDerived().AlwaysRebuild() &&
4607 TryBlock
.get() == S
->getTryBlock() &&
4609 return SemaRef
.Owned(S
);
4611 return getDerived().RebuildCXXTryStmt(S
->getTryLoc(), TryBlock
.get(),
4612 move_arg(Handlers
));
4615 //===----------------------------------------------------------------------===//
4616 // Expression transformation
4617 //===----------------------------------------------------------------------===//
4618 template<typename Derived
>
4620 TreeTransform
<Derived
>::TransformPredefinedExpr(PredefinedExpr
*E
) {
4621 return SemaRef
.Owned(E
);
4624 template<typename Derived
>
4626 TreeTransform
<Derived
>::TransformDeclRefExpr(DeclRefExpr
*E
) {
4627 NestedNameSpecifier
*Qualifier
= 0;
4628 if (E
->getQualifier()) {
4629 Qualifier
= getDerived().TransformNestedNameSpecifier(E
->getQualifier(),
4630 E
->getQualifierRange());
4636 = cast_or_null
<ValueDecl
>(getDerived().TransformDecl(E
->getLocation(),
4641 DeclarationNameInfo NameInfo
= E
->getNameInfo();
4642 if (NameInfo
.getName()) {
4643 NameInfo
= getDerived().TransformDeclarationNameInfo(NameInfo
);
4644 if (!NameInfo
.getName())
4648 if (!getDerived().AlwaysRebuild() &&
4649 Qualifier
== E
->getQualifier() &&
4650 ND
== E
->getDecl() &&
4651 NameInfo
.getName() == E
->getDecl()->getDeclName() &&
4652 !E
->hasExplicitTemplateArgs()) {
4654 // Mark it referenced in the new context regardless.
4655 // FIXME: this is a bit instantiation-specific.
4656 SemaRef
.MarkDeclarationReferenced(E
->getLocation(), ND
);
4658 return SemaRef
.Owned(E
);
4661 TemplateArgumentListInfo TransArgs
, *TemplateArgs
= 0;
4662 if (E
->hasExplicitTemplateArgs()) {
4663 TemplateArgs
= &TransArgs
;
4664 TransArgs
.setLAngleLoc(E
->getLAngleLoc());
4665 TransArgs
.setRAngleLoc(E
->getRAngleLoc());
4666 if (getDerived().TransformTemplateArguments(E
->getTemplateArgs(),
4667 E
->getNumTemplateArgs(),
4672 return getDerived().RebuildDeclRefExpr(Qualifier
, E
->getQualifierRange(),
4673 ND
, NameInfo
, TemplateArgs
);
4676 template<typename Derived
>
4678 TreeTransform
<Derived
>::TransformIntegerLiteral(IntegerLiteral
*E
) {
4679 return SemaRef
.Owned(E
);
4682 template<typename Derived
>
4684 TreeTransform
<Derived
>::TransformFloatingLiteral(FloatingLiteral
*E
) {
4685 return SemaRef
.Owned(E
);
4688 template<typename Derived
>
4690 TreeTransform
<Derived
>::TransformImaginaryLiteral(ImaginaryLiteral
*E
) {
4691 return SemaRef
.Owned(E
);
4694 template<typename Derived
>
4696 TreeTransform
<Derived
>::TransformStringLiteral(StringLiteral
*E
) {
4697 return SemaRef
.Owned(E
);
4700 template<typename Derived
>
4702 TreeTransform
<Derived
>::TransformCharacterLiteral(CharacterLiteral
*E
) {
4703 return SemaRef
.Owned(E
);
4706 template<typename Derived
>
4708 TreeTransform
<Derived
>::TransformParenExpr(ParenExpr
*E
) {
4709 ExprResult SubExpr
= getDerived().TransformExpr(E
->getSubExpr());
4710 if (SubExpr
.isInvalid())
4713 if (!getDerived().AlwaysRebuild() && SubExpr
.get() == E
->getSubExpr())
4714 return SemaRef
.Owned(E
);
4716 return getDerived().RebuildParenExpr(SubExpr
.get(), E
->getLParen(),
4720 template<typename Derived
>
4722 TreeTransform
<Derived
>::TransformUnaryOperator(UnaryOperator
*E
) {
4723 ExprResult SubExpr
= getDerived().TransformExpr(E
->getSubExpr());
4724 if (SubExpr
.isInvalid())
4727 if (!getDerived().AlwaysRebuild() && SubExpr
.get() == E
->getSubExpr())
4728 return SemaRef
.Owned(E
);
4730 return getDerived().RebuildUnaryOperator(E
->getOperatorLoc(),
4735 template<typename Derived
>
4737 TreeTransform
<Derived
>::TransformOffsetOfExpr(OffsetOfExpr
*E
) {
4738 // Transform the type.
4739 TypeSourceInfo
*Type
= getDerived().TransformType(E
->getTypeSourceInfo());
4743 // Transform all of the components into components similar to what the
4745 // FIXME: It would be slightly more efficient in the non-dependent case to
4746 // just map FieldDecls, rather than requiring the rebuilder to look for
4747 // the fields again. However, __builtin_offsetof is rare enough in
4748 // template code that we don't care.
4749 bool ExprChanged
= false;
4750 typedef Sema::OffsetOfComponent Component
;
4751 typedef OffsetOfExpr::OffsetOfNode Node
;
4752 llvm::SmallVector
<Component
, 4> Components
;
4753 for (unsigned I
= 0, N
= E
->getNumComponents(); I
!= N
; ++I
) {
4754 const Node
&ON
= E
->getComponent(I
);
4756 Comp
.isBrackets
= true;
4757 Comp
.LocStart
= ON
.getRange().getBegin();
4758 Comp
.LocEnd
= ON
.getRange().getEnd();
4759 switch (ON
.getKind()) {
4761 Expr
*FromIndex
= E
->getIndexExpr(ON
.getArrayExprIndex());
4762 ExprResult Index
= getDerived().TransformExpr(FromIndex
);
4763 if (Index
.isInvalid())
4766 ExprChanged
= ExprChanged
|| Index
.get() != FromIndex
;
4767 Comp
.isBrackets
= true;
4768 Comp
.U
.E
= Index
.get();
4773 case Node::Identifier
:
4774 Comp
.isBrackets
= false;
4775 Comp
.U
.IdentInfo
= ON
.getFieldName();
4776 if (!Comp
.U
.IdentInfo
)
4782 // Will be recomputed during the rebuild.
4786 Components
.push_back(Comp
);
4789 // If nothing changed, retain the existing expression.
4790 if (!getDerived().AlwaysRebuild() &&
4791 Type
== E
->getTypeSourceInfo() &&
4793 return SemaRef
.Owned(E
);
4795 // Build a new offsetof expression.
4796 return getDerived().RebuildOffsetOfExpr(E
->getOperatorLoc(), Type
,
4797 Components
.data(), Components
.size(),
4801 template<typename Derived
>
4803 TreeTransform
<Derived
>::TransformOpaqueValueExpr(OpaqueValueExpr
*E
) {
4804 assert(getDerived().AlreadyTransformed(E
->getType()) &&
4805 "opaque value expression requires transformation");
4806 return SemaRef
.Owned(E
);
4809 template<typename Derived
>
4811 TreeTransform
<Derived
>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr
*E
) {
4812 if (E
->isArgumentType()) {
4813 TypeSourceInfo
*OldT
= E
->getArgumentTypeInfo();
4815 TypeSourceInfo
*NewT
= getDerived().TransformType(OldT
);
4819 if (!getDerived().AlwaysRebuild() && OldT
== NewT
)
4820 return SemaRef
.Owned(E
);
4822 return getDerived().RebuildSizeOfAlignOf(NewT
, E
->getOperatorLoc(),
4824 E
->getSourceRange());
4829 // C++0x [expr.sizeof]p1:
4830 // The operand is either an expression, which is an unevaluated operand
4832 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
4834 SubExpr
= getDerived().TransformExpr(E
->getArgumentExpr());
4835 if (SubExpr
.isInvalid())
4838 if (!getDerived().AlwaysRebuild() && SubExpr
.get() == E
->getArgumentExpr())
4839 return SemaRef
.Owned(E
);
4842 return getDerived().RebuildSizeOfAlignOf(SubExpr
.get(), E
->getOperatorLoc(),
4844 E
->getSourceRange());
4847 template<typename Derived
>
4849 TreeTransform
<Derived
>::TransformArraySubscriptExpr(ArraySubscriptExpr
*E
) {
4850 ExprResult LHS
= getDerived().TransformExpr(E
->getLHS());
4851 if (LHS
.isInvalid())
4854 ExprResult RHS
= getDerived().TransformExpr(E
->getRHS());
4855 if (RHS
.isInvalid())
4859 if (!getDerived().AlwaysRebuild() &&
4860 LHS
.get() == E
->getLHS() &&
4861 RHS
.get() == E
->getRHS())
4862 return SemaRef
.Owned(E
);
4864 return getDerived().RebuildArraySubscriptExpr(LHS
.get(),
4865 /*FIXME:*/E
->getLHS()->getLocStart(),
4867 E
->getRBracketLoc());
4870 template<typename Derived
>
4872 TreeTransform
<Derived
>::TransformCallExpr(CallExpr
*E
) {
4873 // Transform the callee.
4874 ExprResult Callee
= getDerived().TransformExpr(E
->getCallee());
4875 if (Callee
.isInvalid())
4878 // Transform arguments.
4879 bool ArgChanged
= false;
4880 ASTOwningVector
<Expr
*> Args(SemaRef
);
4881 for (unsigned I
= 0, N
= E
->getNumArgs(); I
!= N
; ++I
) {
4882 ExprResult Arg
= getDerived().TransformExpr(E
->getArg(I
));
4883 if (Arg
.isInvalid())
4886 ArgChanged
= ArgChanged
|| Arg
.get() != E
->getArg(I
);
4887 Args
.push_back(Arg
.get());
4890 if (!getDerived().AlwaysRebuild() &&
4891 Callee
.get() == E
->getCallee() &&
4893 return SemaRef
.Owned(E
);
4895 // FIXME: Wrong source location information for the '('.
4896 SourceLocation FakeLParenLoc
4897 = ((Expr
*)Callee
.get())->getSourceRange().getBegin();
4898 return getDerived().RebuildCallExpr(Callee
.get(), FakeLParenLoc
,
4903 template<typename Derived
>
4905 TreeTransform
<Derived
>::TransformMemberExpr(MemberExpr
*E
) {
4906 ExprResult Base
= getDerived().TransformExpr(E
->getBase());
4907 if (Base
.isInvalid())
4910 NestedNameSpecifier
*Qualifier
= 0;
4911 if (E
->hasQualifier()) {
4913 = getDerived().TransformNestedNameSpecifier(E
->getQualifier(),
4914 E
->getQualifierRange());
4920 = cast_or_null
<ValueDecl
>(getDerived().TransformDecl(E
->getMemberLoc(),
4921 E
->getMemberDecl()));
4925 NamedDecl
*FoundDecl
= E
->getFoundDecl();
4926 if (FoundDecl
== E
->getMemberDecl()) {
4929 FoundDecl
= cast_or_null
<NamedDecl
>(
4930 getDerived().TransformDecl(E
->getMemberLoc(), FoundDecl
));
4935 if (!getDerived().AlwaysRebuild() &&
4936 Base
.get() == E
->getBase() &&
4937 Qualifier
== E
->getQualifier() &&
4938 Member
== E
->getMemberDecl() &&
4939 FoundDecl
== E
->getFoundDecl() &&
4940 !E
->hasExplicitTemplateArgs()) {
4942 // Mark it referenced in the new context regardless.
4943 // FIXME: this is a bit instantiation-specific.
4944 SemaRef
.MarkDeclarationReferenced(E
->getMemberLoc(), Member
);
4945 return SemaRef
.Owned(E
);
4948 TemplateArgumentListInfo TransArgs
;
4949 if (E
->hasExplicitTemplateArgs()) {
4950 TransArgs
.setLAngleLoc(E
->getLAngleLoc());
4951 TransArgs
.setRAngleLoc(E
->getRAngleLoc());
4952 if (getDerived().TransformTemplateArguments(E
->getTemplateArgs(),
4953 E
->getNumTemplateArgs(),
4958 // FIXME: Bogus source location for the operator
4959 SourceLocation FakeOperatorLoc
4960 = SemaRef
.PP
.getLocForEndOfToken(E
->getBase()->getSourceRange().getEnd());
4962 // FIXME: to do this check properly, we will need to preserve the
4963 // first-qualifier-in-scope here, just in case we had a dependent
4964 // base (and therefore couldn't do the check) and a
4965 // nested-name-qualifier (and therefore could do the lookup).
4966 NamedDecl
*FirstQualifierInScope
= 0;
4968 return getDerived().RebuildMemberExpr(Base
.get(), FakeOperatorLoc
,
4971 E
->getQualifierRange(),
4972 E
->getMemberNameInfo(),
4975 (E
->hasExplicitTemplateArgs()
4977 FirstQualifierInScope
);
4980 template<typename Derived
>
4982 TreeTransform
<Derived
>::TransformBinaryOperator(BinaryOperator
*E
) {
4983 ExprResult LHS
= getDerived().TransformExpr(E
->getLHS());
4984 if (LHS
.isInvalid())
4987 ExprResult RHS
= getDerived().TransformExpr(E
->getRHS());
4988 if (RHS
.isInvalid())
4991 if (!getDerived().AlwaysRebuild() &&
4992 LHS
.get() == E
->getLHS() &&
4993 RHS
.get() == E
->getRHS())
4994 return SemaRef
.Owned(E
);
4996 return getDerived().RebuildBinaryOperator(E
->getOperatorLoc(), E
->getOpcode(),
4997 LHS
.get(), RHS
.get());
5000 template<typename Derived
>
5002 TreeTransform
<Derived
>::TransformCompoundAssignOperator(
5003 CompoundAssignOperator
*E
) {
5004 return getDerived().TransformBinaryOperator(E
);
5007 template<typename Derived
>
5009 TreeTransform
<Derived
>::TransformConditionalOperator(ConditionalOperator
*E
) {
5010 ExprResult Cond
= getDerived().TransformExpr(E
->getCond());
5011 if (Cond
.isInvalid())
5014 ExprResult LHS
= getDerived().TransformExpr(E
->getLHS());
5015 if (LHS
.isInvalid())
5018 ExprResult RHS
= getDerived().TransformExpr(E
->getRHS());
5019 if (RHS
.isInvalid())
5022 if (!getDerived().AlwaysRebuild() &&
5023 Cond
.get() == E
->getCond() &&
5024 LHS
.get() == E
->getLHS() &&
5025 RHS
.get() == E
->getRHS())
5026 return SemaRef
.Owned(E
);
5028 return getDerived().RebuildConditionalOperator(Cond
.get(),
5029 E
->getQuestionLoc(),
5035 template<typename Derived
>
5037 TreeTransform
<Derived
>::TransformImplicitCastExpr(ImplicitCastExpr
*E
) {
5038 // Implicit casts are eliminated during transformation, since they
5039 // will be recomputed by semantic analysis after transformation.
5040 return getDerived().TransformExpr(E
->getSubExprAsWritten());
5043 template<typename Derived
>
5045 TreeTransform
<Derived
>::TransformCStyleCastExpr(CStyleCastExpr
*E
) {
5046 TypeSourceInfo
*Type
= getDerived().TransformType(E
->getTypeInfoAsWritten());
5051 = getDerived().TransformExpr(E
->getSubExprAsWritten());
5052 if (SubExpr
.isInvalid())
5055 if (!getDerived().AlwaysRebuild() &&
5056 Type
== E
->getTypeInfoAsWritten() &&
5057 SubExpr
.get() == E
->getSubExpr())
5058 return SemaRef
.Owned(E
);
5060 return getDerived().RebuildCStyleCastExpr(E
->getLParenLoc(),
5066 template<typename Derived
>
5068 TreeTransform
<Derived
>::TransformCompoundLiteralExpr(CompoundLiteralExpr
*E
) {
5069 TypeSourceInfo
*OldT
= E
->getTypeSourceInfo();
5070 TypeSourceInfo
*NewT
= getDerived().TransformType(OldT
);
5074 ExprResult Init
= getDerived().TransformExpr(E
->getInitializer());
5075 if (Init
.isInvalid())
5078 if (!getDerived().AlwaysRebuild() &&
5080 Init
.get() == E
->getInitializer())
5081 return SemaRef
.Owned(E
);
5083 // Note: the expression type doesn't necessarily match the
5084 // type-as-written, but that's okay, because it should always be
5085 // derivable from the initializer.
5087 return getDerived().RebuildCompoundLiteralExpr(E
->getLParenLoc(), NewT
,
5088 /*FIXME:*/E
->getInitializer()->getLocEnd(),
5092 template<typename Derived
>
5094 TreeTransform
<Derived
>::TransformExtVectorElementExpr(ExtVectorElementExpr
*E
) {
5095 ExprResult Base
= getDerived().TransformExpr(E
->getBase());
5096 if (Base
.isInvalid())
5099 if (!getDerived().AlwaysRebuild() &&
5100 Base
.get() == E
->getBase())
5101 return SemaRef
.Owned(E
);
5103 // FIXME: Bad source location
5104 SourceLocation FakeOperatorLoc
5105 = SemaRef
.PP
.getLocForEndOfToken(E
->getBase()->getLocEnd());
5106 return getDerived().RebuildExtVectorElementExpr(Base
.get(), FakeOperatorLoc
,
5107 E
->getAccessorLoc(),
5111 template<typename Derived
>
5113 TreeTransform
<Derived
>::TransformInitListExpr(InitListExpr
*E
) {
5114 bool InitChanged
= false;
5116 ASTOwningVector
<Expr
*, 4> Inits(SemaRef
);
5117 for (unsigned I
= 0, N
= E
->getNumInits(); I
!= N
; ++I
) {
5118 ExprResult Init
= getDerived().TransformExpr(E
->getInit(I
));
5119 if (Init
.isInvalid())
5122 InitChanged
= InitChanged
|| Init
.get() != E
->getInit(I
);
5123 Inits
.push_back(Init
.get());
5126 if (!getDerived().AlwaysRebuild() && !InitChanged
)
5127 return SemaRef
.Owned(E
);
5129 return getDerived().RebuildInitList(E
->getLBraceLoc(), move_arg(Inits
),
5130 E
->getRBraceLoc(), E
->getType());
5133 template<typename Derived
>
5135 TreeTransform
<Derived
>::TransformDesignatedInitExpr(DesignatedInitExpr
*E
) {
5138 // transform the initializer value
5139 ExprResult Init
= getDerived().TransformExpr(E
->getInit());
5140 if (Init
.isInvalid())
5143 // transform the designators.
5144 ASTOwningVector
<Expr
*, 4> ArrayExprs(SemaRef
);
5145 bool ExprChanged
= false;
5146 for (DesignatedInitExpr::designators_iterator D
= E
->designators_begin(),
5147 DEnd
= E
->designators_end();
5149 if (D
->isFieldDesignator()) {
5150 Desig
.AddDesignator(Designator::getField(D
->getFieldName(),
5156 if (D
->isArrayDesignator()) {
5157 ExprResult Index
= getDerived().TransformExpr(E
->getArrayIndex(*D
));
5158 if (Index
.isInvalid())
5161 Desig
.AddDesignator(Designator::getArray(Index
.get(),
5162 D
->getLBracketLoc()));
5164 ExprChanged
= ExprChanged
|| Init
.get() != E
->getArrayIndex(*D
);
5165 ArrayExprs
.push_back(Index
.release());
5169 assert(D
->isArrayRangeDesignator() && "New kind of designator?");
5171 = getDerived().TransformExpr(E
->getArrayRangeStart(*D
));
5172 if (Start
.isInvalid())
5175 ExprResult End
= getDerived().TransformExpr(E
->getArrayRangeEnd(*D
));
5176 if (End
.isInvalid())
5179 Desig
.AddDesignator(Designator::getArrayRange(Start
.get(),
5181 D
->getLBracketLoc(),
5182 D
->getEllipsisLoc()));
5184 ExprChanged
= ExprChanged
|| Start
.get() != E
->getArrayRangeStart(*D
) ||
5185 End
.get() != E
->getArrayRangeEnd(*D
);
5187 ArrayExprs
.push_back(Start
.release());
5188 ArrayExprs
.push_back(End
.release());
5191 if (!getDerived().AlwaysRebuild() &&
5192 Init
.get() == E
->getInit() &&
5194 return SemaRef
.Owned(E
);
5196 return getDerived().RebuildDesignatedInitExpr(Desig
, move_arg(ArrayExprs
),
5197 E
->getEqualOrColonLoc(),
5198 E
->usesGNUSyntax(), Init
.get());
5201 template<typename Derived
>
5203 TreeTransform
<Derived
>::TransformImplicitValueInitExpr(
5204 ImplicitValueInitExpr
*E
) {
5205 TemporaryBase
Rebase(*this, E
->getLocStart(), DeclarationName());
5207 // FIXME: Will we ever have proper type location here? Will we actually
5208 // need to transform the type?
5209 QualType T
= getDerived().TransformType(E
->getType());
5213 if (!getDerived().AlwaysRebuild() &&
5215 return SemaRef
.Owned(E
);
5217 return getDerived().RebuildImplicitValueInitExpr(T
);
5220 template<typename Derived
>
5222 TreeTransform
<Derived
>::TransformVAArgExpr(VAArgExpr
*E
) {
5223 TypeSourceInfo
*TInfo
= getDerived().TransformType(E
->getWrittenTypeInfo());
5227 ExprResult SubExpr
= getDerived().TransformExpr(E
->getSubExpr());
5228 if (SubExpr
.isInvalid())
5231 if (!getDerived().AlwaysRebuild() &&
5232 TInfo
== E
->getWrittenTypeInfo() &&
5233 SubExpr
.get() == E
->getSubExpr())
5234 return SemaRef
.Owned(E
);
5236 return getDerived().RebuildVAArgExpr(E
->getBuiltinLoc(), SubExpr
.get(),
5237 TInfo
, E
->getRParenLoc());
5240 template<typename Derived
>
5242 TreeTransform
<Derived
>::TransformParenListExpr(ParenListExpr
*E
) {
5243 bool ArgumentChanged
= false;
5244 ASTOwningVector
<Expr
*, 4> Inits(SemaRef
);
5245 for (unsigned I
= 0, N
= E
->getNumExprs(); I
!= N
; ++I
) {
5246 ExprResult Init
= getDerived().TransformExpr(E
->getExpr(I
));
5247 if (Init
.isInvalid())
5250 ArgumentChanged
= ArgumentChanged
|| Init
.get() != E
->getExpr(I
);
5251 Inits
.push_back(Init
.get());
5254 return getDerived().RebuildParenListExpr(E
->getLParenLoc(),
5259 /// \brief Transform an address-of-label expression.
5261 /// By default, the transformation of an address-of-label expression always
5262 /// rebuilds the expression, so that the label identifier can be resolved to
5263 /// the corresponding label statement by semantic analysis.
5264 template<typename Derived
>
5266 TreeTransform
<Derived
>::TransformAddrLabelExpr(AddrLabelExpr
*E
) {
5267 return getDerived().RebuildAddrLabelExpr(E
->getAmpAmpLoc(), E
->getLabelLoc(),
5271 template<typename Derived
>
5273 TreeTransform
<Derived
>::TransformStmtExpr(StmtExpr
*E
) {
5275 = getDerived().TransformCompoundStmt(E
->getSubStmt(), true);
5276 if (SubStmt
.isInvalid())
5279 if (!getDerived().AlwaysRebuild() &&
5280 SubStmt
.get() == E
->getSubStmt())
5281 return SemaRef
.Owned(E
);
5283 return getDerived().RebuildStmtExpr(E
->getLParenLoc(),
5288 template<typename Derived
>
5290 TreeTransform
<Derived
>::TransformChooseExpr(ChooseExpr
*E
) {
5291 ExprResult Cond
= getDerived().TransformExpr(E
->getCond());
5292 if (Cond
.isInvalid())
5295 ExprResult LHS
= getDerived().TransformExpr(E
->getLHS());
5296 if (LHS
.isInvalid())
5299 ExprResult RHS
= getDerived().TransformExpr(E
->getRHS());
5300 if (RHS
.isInvalid())
5303 if (!getDerived().AlwaysRebuild() &&
5304 Cond
.get() == E
->getCond() &&
5305 LHS
.get() == E
->getLHS() &&
5306 RHS
.get() == E
->getRHS())
5307 return SemaRef
.Owned(E
);
5309 return getDerived().RebuildChooseExpr(E
->getBuiltinLoc(),
5310 Cond
.get(), LHS
.get(), RHS
.get(),
5314 template<typename Derived
>
5316 TreeTransform
<Derived
>::TransformGNUNullExpr(GNUNullExpr
*E
) {
5317 return SemaRef
.Owned(E
);
5320 template<typename Derived
>
5322 TreeTransform
<Derived
>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr
*E
) {
5323 switch (E
->getOperator()) {
5327 case OO_Array_Delete
:
5328 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
5332 // This is a call to an object's operator().
5333 assert(E
->getNumArgs() >= 1 && "Object call is missing arguments");
5335 // Transform the object itself.
5336 ExprResult Object
= getDerived().TransformExpr(E
->getArg(0));
5337 if (Object
.isInvalid())
5340 // FIXME: Poor location information
5341 SourceLocation FakeLParenLoc
5342 = SemaRef
.PP
.getLocForEndOfToken(
5343 static_cast<Expr
*>(Object
.get())->getLocEnd());
5345 // Transform the call arguments.
5346 ASTOwningVector
<Expr
*> Args(SemaRef
);
5347 for (unsigned I
= 1, N
= E
->getNumArgs(); I
!= N
; ++I
) {
5348 if (getDerived().DropCallArgument(E
->getArg(I
)))
5351 ExprResult Arg
= getDerived().TransformExpr(E
->getArg(I
));
5352 if (Arg
.isInvalid())
5355 Args
.push_back(Arg
.release());
5358 return getDerived().RebuildCallExpr(Object
.get(), FakeLParenLoc
,
5363 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
5365 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
5366 #include "clang/Basic/OperatorKinds.def"
5371 case OO_Conditional
:
5372 llvm_unreachable("conditional operator is not actually overloadable");
5376 case NUM_OVERLOADED_OPERATORS
:
5377 llvm_unreachable("not an overloaded operator?");
5381 ExprResult Callee
= getDerived().TransformExpr(E
->getCallee());
5382 if (Callee
.isInvalid())
5385 ExprResult First
= getDerived().TransformExpr(E
->getArg(0));
5386 if (First
.isInvalid())
5390 if (E
->getNumArgs() == 2) {
5391 Second
= getDerived().TransformExpr(E
->getArg(1));
5392 if (Second
.isInvalid())
5396 if (!getDerived().AlwaysRebuild() &&
5397 Callee
.get() == E
->getCallee() &&
5398 First
.get() == E
->getArg(0) &&
5399 (E
->getNumArgs() != 2 || Second
.get() == E
->getArg(1)))
5400 return SemaRef
.Owned(E
);
5402 return getDerived().RebuildCXXOperatorCallExpr(E
->getOperator(),
5403 E
->getOperatorLoc(),
5409 template<typename Derived
>
5411 TreeTransform
<Derived
>::TransformCXXMemberCallExpr(CXXMemberCallExpr
*E
) {
5412 return getDerived().TransformCallExpr(E
);
5415 template<typename Derived
>
5417 TreeTransform
<Derived
>::TransformCXXNamedCastExpr(CXXNamedCastExpr
*E
) {
5418 TypeSourceInfo
*Type
= getDerived().TransformType(E
->getTypeInfoAsWritten());
5423 = getDerived().TransformExpr(E
->getSubExprAsWritten());
5424 if (SubExpr
.isInvalid())
5427 if (!getDerived().AlwaysRebuild() &&
5428 Type
== E
->getTypeInfoAsWritten() &&
5429 SubExpr
.get() == E
->getSubExpr())
5430 return SemaRef
.Owned(E
);
5432 // FIXME: Poor source location information here.
5433 SourceLocation FakeLAngleLoc
5434 = SemaRef
.PP
.getLocForEndOfToken(E
->getOperatorLoc());
5435 SourceLocation FakeRAngleLoc
= E
->getSubExpr()->getSourceRange().getBegin();
5436 SourceLocation FakeRParenLoc
5437 = SemaRef
.PP
.getLocForEndOfToken(
5438 E
->getSubExpr()->getSourceRange().getEnd());
5439 return getDerived().RebuildCXXNamedCastExpr(E
->getOperatorLoc(),
5449 template<typename Derived
>
5451 TreeTransform
<Derived
>::TransformCXXStaticCastExpr(CXXStaticCastExpr
*E
) {
5452 return getDerived().TransformCXXNamedCastExpr(E
);
5455 template<typename Derived
>
5457 TreeTransform
<Derived
>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr
*E
) {
5458 return getDerived().TransformCXXNamedCastExpr(E
);
5461 template<typename Derived
>
5463 TreeTransform
<Derived
>::TransformCXXReinterpretCastExpr(
5464 CXXReinterpretCastExpr
*E
) {
5465 return getDerived().TransformCXXNamedCastExpr(E
);
5468 template<typename Derived
>
5470 TreeTransform
<Derived
>::TransformCXXConstCastExpr(CXXConstCastExpr
*E
) {
5471 return getDerived().TransformCXXNamedCastExpr(E
);
5474 template<typename Derived
>
5476 TreeTransform
<Derived
>::TransformCXXFunctionalCastExpr(
5477 CXXFunctionalCastExpr
*E
) {
5478 TypeSourceInfo
*Type
= getDerived().TransformType(E
->getTypeInfoAsWritten());
5483 = getDerived().TransformExpr(E
->getSubExprAsWritten());
5484 if (SubExpr
.isInvalid())
5487 if (!getDerived().AlwaysRebuild() &&
5488 Type
== E
->getTypeInfoAsWritten() &&
5489 SubExpr
.get() == E
->getSubExpr())
5490 return SemaRef
.Owned(E
);
5492 return getDerived().RebuildCXXFunctionalCastExpr(Type
,
5493 /*FIXME:*/E
->getSubExpr()->getLocStart(),
5498 template<typename Derived
>
5500 TreeTransform
<Derived
>::TransformCXXTypeidExpr(CXXTypeidExpr
*E
) {
5501 if (E
->isTypeOperand()) {
5502 TypeSourceInfo
*TInfo
5503 = getDerived().TransformType(E
->getTypeOperandSourceInfo());
5507 if (!getDerived().AlwaysRebuild() &&
5508 TInfo
== E
->getTypeOperandSourceInfo())
5509 return SemaRef
.Owned(E
);
5511 return getDerived().RebuildCXXTypeidExpr(E
->getType(),
5517 // We don't know whether the expression is potentially evaluated until
5518 // after we perform semantic analysis, so the expression is potentially
5519 // potentially evaluated.
5520 EnterExpressionEvaluationContext
Unevaluated(SemaRef
,
5521 Sema::PotentiallyPotentiallyEvaluated
);
5523 ExprResult SubExpr
= getDerived().TransformExpr(E
->getExprOperand());
5524 if (SubExpr
.isInvalid())
5527 if (!getDerived().AlwaysRebuild() &&
5528 SubExpr
.get() == E
->getExprOperand())
5529 return SemaRef
.Owned(E
);
5531 return getDerived().RebuildCXXTypeidExpr(E
->getType(),
5537 template<typename Derived
>
5539 TreeTransform
<Derived
>::TransformCXXUuidofExpr(CXXUuidofExpr
*E
) {
5540 if (E
->isTypeOperand()) {
5541 TypeSourceInfo
*TInfo
5542 = getDerived().TransformType(E
->getTypeOperandSourceInfo());
5546 if (!getDerived().AlwaysRebuild() &&
5547 TInfo
== E
->getTypeOperandSourceInfo())
5548 return SemaRef
.Owned(E
);
5550 return getDerived().RebuildCXXTypeidExpr(E
->getType(),
5556 // We don't know whether the expression is potentially evaluated until
5557 // after we perform semantic analysis, so the expression is potentially
5558 // potentially evaluated.
5559 EnterExpressionEvaluationContext
Unevaluated(SemaRef
, Sema::Unevaluated
);
5561 ExprResult SubExpr
= getDerived().TransformExpr(E
->getExprOperand());
5562 if (SubExpr
.isInvalid())
5565 if (!getDerived().AlwaysRebuild() &&
5566 SubExpr
.get() == E
->getExprOperand())
5567 return SemaRef
.Owned(E
);
5569 return getDerived().RebuildCXXUuidofExpr(E
->getType(),
5575 template<typename Derived
>
5577 TreeTransform
<Derived
>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr
*E
) {
5578 return SemaRef
.Owned(E
);
5581 template<typename Derived
>
5583 TreeTransform
<Derived
>::TransformCXXNullPtrLiteralExpr(
5584 CXXNullPtrLiteralExpr
*E
) {
5585 return SemaRef
.Owned(E
);
5588 template<typename Derived
>
5590 TreeTransform
<Derived
>::TransformCXXThisExpr(CXXThisExpr
*E
) {
5591 DeclContext
*DC
= getSema().getFunctionLevelDeclContext();
5592 CXXMethodDecl
*MD
= dyn_cast
<CXXMethodDecl
>(DC
);
5593 QualType T
= MD
->getThisType(getSema().Context
);
5595 if (!getDerived().AlwaysRebuild() && T
== E
->getType())
5596 return SemaRef
.Owned(E
);
5598 return getDerived().RebuildCXXThisExpr(E
->getLocStart(), T
, E
->isImplicit());
5601 template<typename Derived
>
5603 TreeTransform
<Derived
>::TransformCXXThrowExpr(CXXThrowExpr
*E
) {
5604 ExprResult SubExpr
= getDerived().TransformExpr(E
->getSubExpr());
5605 if (SubExpr
.isInvalid())
5608 if (!getDerived().AlwaysRebuild() &&
5609 SubExpr
.get() == E
->getSubExpr())
5610 return SemaRef
.Owned(E
);
5612 return getDerived().RebuildCXXThrowExpr(E
->getThrowLoc(), SubExpr
.get());
5615 template<typename Derived
>
5617 TreeTransform
<Derived
>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr
*E
) {
5619 = cast_or_null
<ParmVarDecl
>(getDerived().TransformDecl(E
->getLocStart(),
5624 if (!getDerived().AlwaysRebuild() &&
5625 Param
== E
->getParam())
5626 return SemaRef
.Owned(E
);
5628 return getDerived().RebuildCXXDefaultArgExpr(E
->getUsedLocation(), Param
);
5631 template<typename Derived
>
5633 TreeTransform
<Derived
>::TransformCXXScalarValueInitExpr(
5634 CXXScalarValueInitExpr
*E
) {
5635 TypeSourceInfo
*T
= getDerived().TransformType(E
->getTypeSourceInfo());
5639 if (!getDerived().AlwaysRebuild() &&
5640 T
== E
->getTypeSourceInfo())
5641 return SemaRef
.Owned(E
);
5643 return getDerived().RebuildCXXScalarValueInitExpr(T
,
5644 /*FIXME:*/T
->getTypeLoc().getEndLoc(),
5648 template<typename Derived
>
5650 TreeTransform
<Derived
>::TransformCXXNewExpr(CXXNewExpr
*E
) {
5651 // Transform the type that we're allocating
5652 TypeSourceInfo
*AllocTypeInfo
5653 = getDerived().TransformType(E
->getAllocatedTypeSourceInfo());
5657 // Transform the size of the array we're allocating (if any).
5658 ExprResult ArraySize
= getDerived().TransformExpr(E
->getArraySize());
5659 if (ArraySize
.isInvalid())
5662 // Transform the placement arguments (if any).
5663 bool ArgumentChanged
= false;
5664 ASTOwningVector
<Expr
*> PlacementArgs(SemaRef
);
5665 for (unsigned I
= 0, N
= E
->getNumPlacementArgs(); I
!= N
; ++I
) {
5666 if (getDerived().DropCallArgument(E
->getPlacementArg(I
))) {
5667 ArgumentChanged
= true;
5671 ExprResult Arg
= getDerived().TransformExpr(E
->getPlacementArg(I
));
5672 if (Arg
.isInvalid())
5675 ArgumentChanged
= ArgumentChanged
|| Arg
.get() != E
->getPlacementArg(I
);
5676 PlacementArgs
.push_back(Arg
.take());
5679 // transform the constructor arguments (if any).
5680 ASTOwningVector
<Expr
*> ConstructorArgs(SemaRef
);
5681 for (unsigned I
= 0, N
= E
->getNumConstructorArgs(); I
!= N
; ++I
) {
5682 if (getDerived().DropCallArgument(E
->getConstructorArg(I
))) {
5683 ArgumentChanged
= true;
5687 ExprResult Arg
= getDerived().TransformExpr(E
->getConstructorArg(I
));
5688 if (Arg
.isInvalid())
5691 ArgumentChanged
= ArgumentChanged
|| Arg
.get() != E
->getConstructorArg(I
);
5692 ConstructorArgs
.push_back(Arg
.take());
5695 // Transform constructor, new operator, and delete operator.
5696 CXXConstructorDecl
*Constructor
= 0;
5697 if (E
->getConstructor()) {
5698 Constructor
= cast_or_null
<CXXConstructorDecl
>(
5699 getDerived().TransformDecl(E
->getLocStart(),
5700 E
->getConstructor()));
5705 FunctionDecl
*OperatorNew
= 0;
5706 if (E
->getOperatorNew()) {
5707 OperatorNew
= cast_or_null
<FunctionDecl
>(
5708 getDerived().TransformDecl(E
->getLocStart(),
5709 E
->getOperatorNew()));
5714 FunctionDecl
*OperatorDelete
= 0;
5715 if (E
->getOperatorDelete()) {
5716 OperatorDelete
= cast_or_null
<FunctionDecl
>(
5717 getDerived().TransformDecl(E
->getLocStart(),
5718 E
->getOperatorDelete()));
5719 if (!OperatorDelete
)
5723 if (!getDerived().AlwaysRebuild() &&
5724 AllocTypeInfo
== E
->getAllocatedTypeSourceInfo() &&
5725 ArraySize
.get() == E
->getArraySize() &&
5726 Constructor
== E
->getConstructor() &&
5727 OperatorNew
== E
->getOperatorNew() &&
5728 OperatorDelete
== E
->getOperatorDelete() &&
5730 // Mark any declarations we need as referenced.
5731 // FIXME: instantiation-specific.
5733 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(), Constructor
);
5735 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(), OperatorNew
);
5737 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(), OperatorDelete
);
5738 return SemaRef
.Owned(E
);
5741 QualType AllocType
= AllocTypeInfo
->getType();
5742 if (!ArraySize
.get()) {
5743 // If no array size was specified, but the new expression was
5744 // instantiated with an array type (e.g., "new T" where T is
5745 // instantiated with "int[4]"), extract the outer bound from the
5746 // array type as our array size. We do this with constant and
5747 // dependently-sized array types.
5748 const ArrayType
*ArrayT
= SemaRef
.Context
.getAsArrayType(AllocType
);
5751 } else if (const ConstantArrayType
*ConsArrayT
5752 = dyn_cast
<ConstantArrayType
>(ArrayT
)) {
5754 = SemaRef
.Owned(IntegerLiteral::Create(SemaRef
.Context
,
5755 ConsArrayT
->getSize(),
5756 SemaRef
.Context
.getSizeType(),
5757 /*FIXME:*/E
->getLocStart()));
5758 AllocType
= ConsArrayT
->getElementType();
5759 } else if (const DependentSizedArrayType
*DepArrayT
5760 = dyn_cast
<DependentSizedArrayType
>(ArrayT
)) {
5761 if (DepArrayT
->getSizeExpr()) {
5762 ArraySize
= SemaRef
.Owned(DepArrayT
->getSizeExpr());
5763 AllocType
= DepArrayT
->getElementType();
5768 return getDerived().RebuildCXXNewExpr(E
->getLocStart(),
5770 /*FIXME:*/E
->getLocStart(),
5771 move_arg(PlacementArgs
),
5772 /*FIXME:*/E
->getLocStart(),
5773 E
->getTypeIdParens(),
5777 /*FIXME:*/E
->getLocStart(),
5778 move_arg(ConstructorArgs
),
5782 template<typename Derived
>
5784 TreeTransform
<Derived
>::TransformCXXDeleteExpr(CXXDeleteExpr
*E
) {
5785 ExprResult Operand
= getDerived().TransformExpr(E
->getArgument());
5786 if (Operand
.isInvalid())
5789 // Transform the delete operator, if known.
5790 FunctionDecl
*OperatorDelete
= 0;
5791 if (E
->getOperatorDelete()) {
5792 OperatorDelete
= cast_or_null
<FunctionDecl
>(
5793 getDerived().TransformDecl(E
->getLocStart(),
5794 E
->getOperatorDelete()));
5795 if (!OperatorDelete
)
5799 if (!getDerived().AlwaysRebuild() &&
5800 Operand
.get() == E
->getArgument() &&
5801 OperatorDelete
== E
->getOperatorDelete()) {
5802 // Mark any declarations we need as referenced.
5803 // FIXME: instantiation-specific.
5805 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(), OperatorDelete
);
5807 if (!E
->getArgument()->isTypeDependent()) {
5808 QualType Destroyed
= SemaRef
.Context
.getBaseElementType(
5809 E
->getDestroyedType());
5810 if (const RecordType
*DestroyedRec
= Destroyed
->getAs
<RecordType
>()) {
5811 CXXRecordDecl
*Record
= cast
<CXXRecordDecl
>(DestroyedRec
->getDecl());
5812 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(),
5813 SemaRef
.LookupDestructor(Record
));
5817 return SemaRef
.Owned(E
);
5820 return getDerived().RebuildCXXDeleteExpr(E
->getLocStart(),
5821 E
->isGlobalDelete(),
5826 template<typename Derived
>
5828 TreeTransform
<Derived
>::TransformCXXPseudoDestructorExpr(
5829 CXXPseudoDestructorExpr
*E
) {
5830 ExprResult Base
= getDerived().TransformExpr(E
->getBase());
5831 if (Base
.isInvalid())
5834 ParsedType ObjectTypePtr
;
5835 bool MayBePseudoDestructor
= false;
5836 Base
= SemaRef
.ActOnStartCXXMemberReference(0, Base
.get(),
5837 E
->getOperatorLoc(),
5838 E
->isArrow()? tok::arrow
: tok::period
,
5840 MayBePseudoDestructor
);
5841 if (Base
.isInvalid())
5844 QualType ObjectType
= ObjectTypePtr
.get();
5845 NestedNameSpecifier
*Qualifier
= E
->getQualifier();
5848 = getDerived().TransformNestedNameSpecifier(E
->getQualifier(),
5849 E
->getQualifierRange(),
5855 PseudoDestructorTypeStorage Destroyed
;
5856 if (E
->getDestroyedTypeInfo()) {
5857 TypeSourceInfo
*DestroyedTypeInfo
5858 = getDerived().TransformTypeInObjectScope(E
->getDestroyedTypeInfo(),
5859 ObjectType
, 0, Qualifier
);
5860 if (!DestroyedTypeInfo
)
5862 Destroyed
= DestroyedTypeInfo
;
5863 } else if (ObjectType
->isDependentType()) {
5864 // We aren't likely to be able to resolve the identifier down to a type
5865 // now anyway, so just retain the identifier.
5866 Destroyed
= PseudoDestructorTypeStorage(E
->getDestroyedTypeIdentifier(),
5867 E
->getDestroyedTypeLoc());
5869 // Look for a destructor known with the given name.
5872 SS
.setScopeRep(Qualifier
);
5873 SS
.setRange(E
->getQualifierRange());
5876 ParsedType T
= SemaRef
.getDestructorName(E
->getTildeLoc(),
5877 *E
->getDestroyedTypeIdentifier(),
5878 E
->getDestroyedTypeLoc(),
5886 = SemaRef
.Context
.getTrivialTypeSourceInfo(SemaRef
.GetTypeFromParser(T
),
5887 E
->getDestroyedTypeLoc());
5890 TypeSourceInfo
*ScopeTypeInfo
= 0;
5891 if (E
->getScopeTypeInfo()) {
5892 ScopeTypeInfo
= getDerived().TransformType(E
->getScopeTypeInfo());
5897 return getDerived().RebuildCXXPseudoDestructorExpr(Base
.get(),
5898 E
->getOperatorLoc(),
5901 E
->getQualifierRange(),
5903 E
->getColonColonLoc(),
5908 template<typename Derived
>
5910 TreeTransform
<Derived
>::TransformUnresolvedLookupExpr(
5911 UnresolvedLookupExpr
*Old
) {
5912 TemporaryBase
Rebase(*this, Old
->getNameLoc(), DeclarationName());
5914 LookupResult
R(SemaRef
, Old
->getName(), Old
->getNameLoc(),
5915 Sema::LookupOrdinaryName
);
5917 // Transform all the decls.
5918 for (UnresolvedLookupExpr::decls_iterator I
= Old
->decls_begin(),
5919 E
= Old
->decls_end(); I
!= E
; ++I
) {
5920 NamedDecl
*InstD
= static_cast<NamedDecl
*>(
5921 getDerived().TransformDecl(Old
->getNameLoc(),
5924 // Silently ignore these if a UsingShadowDecl instantiated to nothing.
5925 // This can happen because of dependent hiding.
5926 if (isa
<UsingShadowDecl
>(*I
))
5932 // Expand using declarations.
5933 if (isa
<UsingDecl
>(InstD
)) {
5934 UsingDecl
*UD
= cast
<UsingDecl
>(InstD
);
5935 for (UsingDecl::shadow_iterator I
= UD
->shadow_begin(),
5936 E
= UD
->shadow_end(); I
!= E
; ++I
)
5944 // Resolve a kind, but don't do any further analysis. If it's
5945 // ambiguous, the callee needs to deal with it.
5948 // Rebuild the nested-name qualifier, if present.
5950 NestedNameSpecifier
*Qualifier
= 0;
5951 if (Old
->getQualifier()) {
5952 Qualifier
= getDerived().TransformNestedNameSpecifier(Old
->getQualifier(),
5953 Old
->getQualifierRange());
5957 SS
.setScopeRep(Qualifier
);
5958 SS
.setRange(Old
->getQualifierRange());
5961 if (Old
->getNamingClass()) {
5962 CXXRecordDecl
*NamingClass
5963 = cast_or_null
<CXXRecordDecl
>(getDerived().TransformDecl(
5965 Old
->getNamingClass()));
5969 R
.setNamingClass(NamingClass
);
5972 // If we have no template arguments, it's a normal declaration name.
5973 if (!Old
->hasExplicitTemplateArgs())
5974 return getDerived().RebuildDeclarationNameExpr(SS
, R
, Old
->requiresADL());
5976 // If we have template arguments, rebuild them, then rebuild the
5977 // templateid expression.
5978 TemplateArgumentListInfo
TransArgs(Old
->getLAngleLoc(), Old
->getRAngleLoc());
5979 if (getDerived().TransformTemplateArguments(Old
->getTemplateArgs(),
5980 Old
->getNumTemplateArgs(),
5984 return getDerived().RebuildTemplateIdExpr(SS
, R
, Old
->requiresADL(),
5988 template<typename Derived
>
5990 TreeTransform
<Derived
>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr
*E
) {
5991 TypeSourceInfo
*T
= getDerived().TransformType(E
->getQueriedTypeSourceInfo());
5995 if (!getDerived().AlwaysRebuild() &&
5996 T
== E
->getQueriedTypeSourceInfo())
5997 return SemaRef
.Owned(E
);
5999 return getDerived().RebuildUnaryTypeTrait(E
->getTrait(),
6005 template<typename Derived
>
6007 TreeTransform
<Derived
>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr
*E
) {
6008 TypeSourceInfo
*LhsT
= getDerived().TransformType(E
->getLhsTypeSourceInfo());
6012 TypeSourceInfo
*RhsT
= getDerived().TransformType(E
->getRhsTypeSourceInfo());
6016 if (!getDerived().AlwaysRebuild() &&
6017 LhsT
== E
->getLhsTypeSourceInfo() && RhsT
== E
->getRhsTypeSourceInfo())
6018 return SemaRef
.Owned(E
);
6020 return getDerived().RebuildBinaryTypeTrait(E
->getTrait(),
6026 template<typename Derived
>
6028 TreeTransform
<Derived
>::TransformDependentScopeDeclRefExpr(
6029 DependentScopeDeclRefExpr
*E
) {
6030 NestedNameSpecifier
*NNS
6031 = getDerived().TransformNestedNameSpecifier(E
->getQualifier(),
6032 E
->getQualifierRange());
6036 // TODO: If this is a conversion-function-id, verify that the
6037 // destination type name (if present) resolves the same way after
6038 // instantiation as it did in the local scope.
6040 DeclarationNameInfo NameInfo
6041 = getDerived().TransformDeclarationNameInfo(E
->getNameInfo());
6042 if (!NameInfo
.getName())
6045 if (!E
->hasExplicitTemplateArgs()) {
6046 if (!getDerived().AlwaysRebuild() &&
6047 NNS
== E
->getQualifier() &&
6048 // Note: it is sufficient to compare the Name component of NameInfo:
6049 // if name has not changed, DNLoc has not changed either.
6050 NameInfo
.getName() == E
->getDeclName())
6051 return SemaRef
.Owned(E
);
6053 return getDerived().RebuildDependentScopeDeclRefExpr(NNS
,
6054 E
->getQualifierRange(),
6056 /*TemplateArgs*/ 0);
6059 TemplateArgumentListInfo
TransArgs(E
->getLAngleLoc(), E
->getRAngleLoc());
6060 if (getDerived().TransformTemplateArguments(E
->getTemplateArgs(),
6061 E
->getNumTemplateArgs(),
6065 return getDerived().RebuildDependentScopeDeclRefExpr(NNS
,
6066 E
->getQualifierRange(),
6071 template<typename Derived
>
6073 TreeTransform
<Derived
>::TransformCXXConstructExpr(CXXConstructExpr
*E
) {
6074 // CXXConstructExprs are always implicit, so when we have a
6075 // 1-argument construction we just transform that argument.
6076 if (E
->getNumArgs() == 1 ||
6077 (E
->getNumArgs() > 1 && getDerived().DropCallArgument(E
->getArg(1))))
6078 return getDerived().TransformExpr(E
->getArg(0));
6080 TemporaryBase
Rebase(*this, /*FIXME*/E
->getLocStart(), DeclarationName());
6082 QualType T
= getDerived().TransformType(E
->getType());
6086 CXXConstructorDecl
*Constructor
6087 = cast_or_null
<CXXConstructorDecl
>(
6088 getDerived().TransformDecl(E
->getLocStart(),
6089 E
->getConstructor()));
6093 bool ArgumentChanged
= false;
6094 ASTOwningVector
<Expr
*> Args(SemaRef
);
6095 for (CXXConstructExpr::arg_iterator Arg
= E
->arg_begin(),
6096 ArgEnd
= E
->arg_end();
6097 Arg
!= ArgEnd
; ++Arg
) {
6098 if (getDerived().DropCallArgument(*Arg
)) {
6099 ArgumentChanged
= true;
6103 ExprResult TransArg
= getDerived().TransformExpr(*Arg
);
6104 if (TransArg
.isInvalid())
6107 ArgumentChanged
= ArgumentChanged
|| TransArg
.get() != *Arg
;
6108 Args
.push_back(TransArg
.get());
6111 if (!getDerived().AlwaysRebuild() &&
6112 T
== E
->getType() &&
6113 Constructor
== E
->getConstructor() &&
6115 // Mark the constructor as referenced.
6116 // FIXME: Instantiation-specific
6117 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(), Constructor
);
6118 return SemaRef
.Owned(E
);
6121 return getDerived().RebuildCXXConstructExpr(T
, /*FIXME:*/E
->getLocStart(),
6122 Constructor
, E
->isElidable(),
6124 E
->requiresZeroInitialization(),
6125 E
->getConstructionKind(),
6126 E
->getParenRange());
6129 /// \brief Transform a C++ temporary-binding expression.
6131 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
6132 /// transform the subexpression and return that.
6133 template<typename Derived
>
6135 TreeTransform
<Derived
>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr
*E
) {
6136 return getDerived().TransformExpr(E
->getSubExpr());
6139 /// \brief Transform a C++ expression that contains cleanups that should
6140 /// be run after the expression is evaluated.
6142 /// Since ExprWithCleanups nodes are implicitly generated, we
6143 /// just transform the subexpression and return that.
6144 template<typename Derived
>
6146 TreeTransform
<Derived
>::TransformExprWithCleanups(ExprWithCleanups
*E
) {
6147 return getDerived().TransformExpr(E
->getSubExpr());
6150 template<typename Derived
>
6152 TreeTransform
<Derived
>::TransformCXXTemporaryObjectExpr(
6153 CXXTemporaryObjectExpr
*E
) {
6154 TypeSourceInfo
*T
= getDerived().TransformType(E
->getTypeSourceInfo());
6158 CXXConstructorDecl
*Constructor
6159 = cast_or_null
<CXXConstructorDecl
>(
6160 getDerived().TransformDecl(E
->getLocStart(),
6161 E
->getConstructor()));
6165 bool ArgumentChanged
= false;
6166 ASTOwningVector
<Expr
*> Args(SemaRef
);
6167 Args
.reserve(E
->getNumArgs());
6168 for (CXXTemporaryObjectExpr::arg_iterator Arg
= E
->arg_begin(),
6169 ArgEnd
= E
->arg_end();
6170 Arg
!= ArgEnd
; ++Arg
) {
6171 if (getDerived().DropCallArgument(*Arg
)) {
6172 ArgumentChanged
= true;
6176 ExprResult TransArg
= getDerived().TransformExpr(*Arg
);
6177 if (TransArg
.isInvalid())
6180 ArgumentChanged
= ArgumentChanged
|| TransArg
.get() != *Arg
;
6181 Args
.push_back((Expr
*)TransArg
.release());
6184 if (!getDerived().AlwaysRebuild() &&
6185 T
== E
->getTypeSourceInfo() &&
6186 Constructor
== E
->getConstructor() &&
6188 // FIXME: Instantiation-specific
6189 SemaRef
.MarkDeclarationReferenced(E
->getLocStart(), Constructor
);
6190 return SemaRef
.MaybeBindToTemporary(E
);
6193 return getDerived().RebuildCXXTemporaryObjectExpr(T
,
6194 /*FIXME:*/T
->getTypeLoc().getEndLoc(),
6199 template<typename Derived
>
6201 TreeTransform
<Derived
>::TransformCXXUnresolvedConstructExpr(
6202 CXXUnresolvedConstructExpr
*E
) {
6203 TypeSourceInfo
*T
= getDerived().TransformType(E
->getTypeSourceInfo());
6207 bool ArgumentChanged
= false;
6208 ASTOwningVector
<Expr
*> Args(SemaRef
);
6209 for (CXXUnresolvedConstructExpr::arg_iterator Arg
= E
->arg_begin(),
6210 ArgEnd
= E
->arg_end();
6211 Arg
!= ArgEnd
; ++Arg
) {
6212 ExprResult TransArg
= getDerived().TransformExpr(*Arg
);
6213 if (TransArg
.isInvalid())
6216 ArgumentChanged
= ArgumentChanged
|| TransArg
.get() != *Arg
;
6217 Args
.push_back(TransArg
.get());
6220 if (!getDerived().AlwaysRebuild() &&
6221 T
== E
->getTypeSourceInfo() &&
6223 return SemaRef
.Owned(E
);
6225 // FIXME: we're faking the locations of the commas
6226 return getDerived().RebuildCXXUnresolvedConstructExpr(T
,
6232 template<typename Derived
>
6234 TreeTransform
<Derived
>::TransformCXXDependentScopeMemberExpr(
6235 CXXDependentScopeMemberExpr
*E
) {
6236 // Transform the base of the expression.
6237 ExprResult
Base((Expr
*) 0);
6240 QualType ObjectType
;
6241 if (!E
->isImplicitAccess()) {
6242 OldBase
= E
->getBase();
6243 Base
= getDerived().TransformExpr(OldBase
);
6244 if (Base
.isInvalid())
6247 // Start the member reference and compute the object's type.
6248 ParsedType ObjectTy
;
6249 bool MayBePseudoDestructor
= false;
6250 Base
= SemaRef
.ActOnStartCXXMemberReference(0, Base
.get(),
6251 E
->getOperatorLoc(),
6252 E
->isArrow()? tok::arrow
: tok::period
,
6254 MayBePseudoDestructor
);
6255 if (Base
.isInvalid())
6258 ObjectType
= ObjectTy
.get();
6259 BaseType
= ((Expr
*) Base
.get())->getType();
6262 BaseType
= getDerived().TransformType(E
->getBaseType());
6263 ObjectType
= BaseType
->getAs
<PointerType
>()->getPointeeType();
6266 // Transform the first part of the nested-name-specifier that qualifies
6268 NamedDecl
*FirstQualifierInScope
6269 = getDerived().TransformFirstQualifierInScope(
6270 E
->getFirstQualifierFoundInScope(),
6271 E
->getQualifierRange().getBegin());
6273 NestedNameSpecifier
*Qualifier
= 0;
6274 if (E
->getQualifier()) {
6275 Qualifier
= getDerived().TransformNestedNameSpecifier(E
->getQualifier(),
6276 E
->getQualifierRange(),
6278 FirstQualifierInScope
);
6283 // TODO: If this is a conversion-function-id, verify that the
6284 // destination type name (if present) resolves the same way after
6285 // instantiation as it did in the local scope.
6287 DeclarationNameInfo NameInfo
6288 = getDerived().TransformDeclarationNameInfo(E
->getMemberNameInfo());
6289 if (!NameInfo
.getName())
6292 if (!E
->hasExplicitTemplateArgs()) {
6293 // This is a reference to a member without an explicitly-specified
6294 // template argument list. Optimize for this common case.
6295 if (!getDerived().AlwaysRebuild() &&
6296 Base
.get() == OldBase
&&
6297 BaseType
== E
->getBaseType() &&
6298 Qualifier
== E
->getQualifier() &&
6299 NameInfo
.getName() == E
->getMember() &&
6300 FirstQualifierInScope
== E
->getFirstQualifierFoundInScope())
6301 return SemaRef
.Owned(E
);
6303 return getDerived().RebuildCXXDependentScopeMemberExpr(Base
.get(),
6306 E
->getOperatorLoc(),
6308 E
->getQualifierRange(),
6309 FirstQualifierInScope
,
6311 /*TemplateArgs*/ 0);
6314 TemplateArgumentListInfo
TransArgs(E
->getLAngleLoc(), E
->getRAngleLoc());
6315 if (getDerived().TransformTemplateArguments(E
->getTemplateArgs(),
6316 E
->getNumTemplateArgs(),
6320 return getDerived().RebuildCXXDependentScopeMemberExpr(Base
.get(),
6323 E
->getOperatorLoc(),
6325 E
->getQualifierRange(),
6326 FirstQualifierInScope
,
6331 template<typename Derived
>
6333 TreeTransform
<Derived
>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr
*Old
) {
6334 // Transform the base of the expression.
6335 ExprResult
Base((Expr
*) 0);
6337 if (!Old
->isImplicitAccess()) {
6338 Base
= getDerived().TransformExpr(Old
->getBase());
6339 if (Base
.isInvalid())
6341 BaseType
= ((Expr
*) Base
.get())->getType();
6343 BaseType
= getDerived().TransformType(Old
->getBaseType());
6346 NestedNameSpecifier
*Qualifier
= 0;
6347 if (Old
->getQualifier()) {
6349 = getDerived().TransformNestedNameSpecifier(Old
->getQualifier(),
6350 Old
->getQualifierRange());
6355 LookupResult
R(SemaRef
, Old
->getMemberNameInfo(),
6356 Sema::LookupOrdinaryName
);
6358 // Transform all the decls.
6359 for (UnresolvedMemberExpr::decls_iterator I
= Old
->decls_begin(),
6360 E
= Old
->decls_end(); I
!= E
; ++I
) {
6361 NamedDecl
*InstD
= static_cast<NamedDecl
*>(
6362 getDerived().TransformDecl(Old
->getMemberLoc(),
6365 // Silently ignore these if a UsingShadowDecl instantiated to nothing.
6366 // This can happen because of dependent hiding.
6367 if (isa
<UsingShadowDecl
>(*I
))
6373 // Expand using declarations.
6374 if (isa
<UsingDecl
>(InstD
)) {
6375 UsingDecl
*UD
= cast
<UsingDecl
>(InstD
);
6376 for (UsingDecl::shadow_iterator I
= UD
->shadow_begin(),
6377 E
= UD
->shadow_end(); I
!= E
; ++I
)
6387 // Determine the naming class.
6388 if (Old
->getNamingClass()) {
6389 CXXRecordDecl
*NamingClass
6390 = cast_or_null
<CXXRecordDecl
>(getDerived().TransformDecl(
6391 Old
->getMemberLoc(),
6392 Old
->getNamingClass()));
6396 R
.setNamingClass(NamingClass
);
6399 TemplateArgumentListInfo TransArgs
;
6400 if (Old
->hasExplicitTemplateArgs()) {
6401 TransArgs
.setLAngleLoc(Old
->getLAngleLoc());
6402 TransArgs
.setRAngleLoc(Old
->getRAngleLoc());
6403 if (getDerived().TransformTemplateArguments(Old
->getTemplateArgs(),
6404 Old
->getNumTemplateArgs(),
6409 // FIXME: to do this check properly, we will need to preserve the
6410 // first-qualifier-in-scope here, just in case we had a dependent
6411 // base (and therefore couldn't do the check) and a
6412 // nested-name-qualifier (and therefore could do the lookup).
6413 NamedDecl
*FirstQualifierInScope
= 0;
6415 return getDerived().RebuildUnresolvedMemberExpr(Base
.get(),
6417 Old
->getOperatorLoc(),
6420 Old
->getQualifierRange(),
6421 FirstQualifierInScope
,
6423 (Old
->hasExplicitTemplateArgs()
6427 template<typename Derived
>
6429 TreeTransform
<Derived
>::TransformCXXNoexceptExpr(CXXNoexceptExpr
*E
) {
6430 ExprResult SubExpr
= getDerived().TransformExpr(E
->getOperand());
6431 if (SubExpr
.isInvalid())
6434 if (!getDerived().AlwaysRebuild() && SubExpr
.get() == E
->getOperand())
6435 return SemaRef
.Owned(E
);
6437 return getDerived().RebuildCXXNoexceptExpr(E
->getSourceRange(),SubExpr
.get());
6440 template<typename Derived
>
6442 TreeTransform
<Derived
>::TransformObjCStringLiteral(ObjCStringLiteral
*E
) {
6443 return SemaRef
.Owned(E
);
6446 template<typename Derived
>
6448 TreeTransform
<Derived
>::TransformObjCEncodeExpr(ObjCEncodeExpr
*E
) {
6449 TypeSourceInfo
*EncodedTypeInfo
6450 = getDerived().TransformType(E
->getEncodedTypeSourceInfo());
6451 if (!EncodedTypeInfo
)
6454 if (!getDerived().AlwaysRebuild() &&
6455 EncodedTypeInfo
== E
->getEncodedTypeSourceInfo())
6456 return SemaRef
.Owned(E
);
6458 return getDerived().RebuildObjCEncodeExpr(E
->getAtLoc(),
6463 template<typename Derived
>
6465 TreeTransform
<Derived
>::TransformObjCMessageExpr(ObjCMessageExpr
*E
) {
6466 // Transform arguments.
6467 bool ArgChanged
= false;
6468 ASTOwningVector
<Expr
*> Args(SemaRef
);
6469 for (unsigned I
= 0, N
= E
->getNumArgs(); I
!= N
; ++I
) {
6470 ExprResult Arg
= getDerived().TransformExpr(E
->getArg(I
));
6471 if (Arg
.isInvalid())
6474 ArgChanged
= ArgChanged
|| Arg
.get() != E
->getArg(I
);
6475 Args
.push_back(Arg
.get());
6478 if (E
->getReceiverKind() == ObjCMessageExpr::Class
) {
6479 // Class message: transform the receiver type.
6480 TypeSourceInfo
*ReceiverTypeInfo
6481 = getDerived().TransformType(E
->getClassReceiverTypeInfo());
6482 if (!ReceiverTypeInfo
)
6485 // If nothing changed, just retain the existing message send.
6486 if (!getDerived().AlwaysRebuild() &&
6487 ReceiverTypeInfo
== E
->getClassReceiverTypeInfo() && !ArgChanged
)
6488 return SemaRef
.Owned(E
);
6490 // Build a new class message send.
6491 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo
,
6493 E
->getSelectorLoc(),
6500 // Instance message: transform the receiver
6501 assert(E
->getReceiverKind() == ObjCMessageExpr::Instance
&&
6502 "Only class and instance messages may be instantiated");
6504 = getDerived().TransformExpr(E
->getInstanceReceiver());
6505 if (Receiver
.isInvalid())
6508 // If nothing changed, just retain the existing message send.
6509 if (!getDerived().AlwaysRebuild() &&
6510 Receiver
.get() == E
->getInstanceReceiver() && !ArgChanged
)
6511 return SemaRef
.Owned(E
);
6513 // Build a new instance message send.
6514 return getDerived().RebuildObjCMessageExpr(Receiver
.get(),
6516 E
->getSelectorLoc(),
6523 template<typename Derived
>
6525 TreeTransform
<Derived
>::TransformObjCSelectorExpr(ObjCSelectorExpr
*E
) {
6526 return SemaRef
.Owned(E
);
6529 template<typename Derived
>
6531 TreeTransform
<Derived
>::TransformObjCProtocolExpr(ObjCProtocolExpr
*E
) {
6532 return SemaRef
.Owned(E
);
6535 template<typename Derived
>
6537 TreeTransform
<Derived
>::TransformObjCIvarRefExpr(ObjCIvarRefExpr
*E
) {
6538 // Transform the base expression.
6539 ExprResult Base
= getDerived().TransformExpr(E
->getBase());
6540 if (Base
.isInvalid())
6543 // We don't need to transform the ivar; it will never change.
6545 // If nothing changed, just retain the existing expression.
6546 if (!getDerived().AlwaysRebuild() &&
6547 Base
.get() == E
->getBase())
6548 return SemaRef
.Owned(E
);
6550 return getDerived().RebuildObjCIvarRefExpr(Base
.get(), E
->getDecl(),
6552 E
->isArrow(), E
->isFreeIvar());
6555 template<typename Derived
>
6557 TreeTransform
<Derived
>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr
*E
) {
6558 // 'super' and types never change. Property never changes. Just
6559 // retain the existing expression.
6560 if (!E
->isObjectReceiver())
6561 return SemaRef
.Owned(E
);
6563 // Transform the base expression.
6564 ExprResult Base
= getDerived().TransformExpr(E
->getBase());
6565 if (Base
.isInvalid())
6568 // We don't need to transform the property; it will never change.
6570 // If nothing changed, just retain the existing expression.
6571 if (!getDerived().AlwaysRebuild() &&
6572 Base
.get() == E
->getBase())
6573 return SemaRef
.Owned(E
);
6575 if (E
->isExplicitProperty())
6576 return getDerived().RebuildObjCPropertyRefExpr(Base
.get(),
6577 E
->getExplicitProperty(),
6580 return getDerived().RebuildObjCPropertyRefExpr(Base
.get(),
6582 E
->getImplicitPropertyGetter(),
6583 E
->getImplicitPropertySetter(),
6587 template<typename Derived
>
6589 TreeTransform
<Derived
>::TransformObjCIsaExpr(ObjCIsaExpr
*E
) {
6590 // Transform the base expression.
6591 ExprResult Base
= getDerived().TransformExpr(E
->getBase());
6592 if (Base
.isInvalid())
6595 // If nothing changed, just retain the existing expression.
6596 if (!getDerived().AlwaysRebuild() &&
6597 Base
.get() == E
->getBase())
6598 return SemaRef
.Owned(E
);
6600 return getDerived().RebuildObjCIsaExpr(Base
.get(), E
->getIsaMemberLoc(),
6604 template<typename Derived
>
6606 TreeTransform
<Derived
>::TransformShuffleVectorExpr(ShuffleVectorExpr
*E
) {
6607 bool ArgumentChanged
= false;
6608 ASTOwningVector
<Expr
*> SubExprs(SemaRef
);
6609 for (unsigned I
= 0, N
= E
->getNumSubExprs(); I
!= N
; ++I
) {
6610 ExprResult SubExpr
= getDerived().TransformExpr(E
->getExpr(I
));
6611 if (SubExpr
.isInvalid())
6614 ArgumentChanged
= ArgumentChanged
|| SubExpr
.get() != E
->getExpr(I
);
6615 SubExprs
.push_back(SubExpr
.get());
6618 if (!getDerived().AlwaysRebuild() &&
6620 return SemaRef
.Owned(E
);
6622 return getDerived().RebuildShuffleVectorExpr(E
->getBuiltinLoc(),
6627 template<typename Derived
>
6629 TreeTransform
<Derived
>::TransformBlockExpr(BlockExpr
*E
) {
6630 SourceLocation
CaretLoc(E
->getExprLoc());
6632 SemaRef
.ActOnBlockStart(CaretLoc
, /*Scope=*/0);
6633 BlockScopeInfo
*CurBlock
= SemaRef
.getCurBlock();
6634 CurBlock
->TheDecl
->setIsVariadic(E
->getBlockDecl()->isVariadic());
6635 llvm::SmallVector
<ParmVarDecl
*, 4> Params
;
6636 llvm::SmallVector
<QualType
, 4> ParamTypes
;
6638 // Parameter substitution.
6639 const BlockDecl
*BD
= E
->getBlockDecl();
6640 for (BlockDecl::param_const_iterator P
= BD
->param_begin(),
6641 EN
= BD
->param_end(); P
!= EN
; ++P
) {
6642 ParmVarDecl
*OldParm
= (*P
);
6643 ParmVarDecl
*NewParm
= getDerived().TransformFunctionTypeParam(OldParm
);
6644 QualType NewType
= NewParm
->getType();
6645 Params
.push_back(NewParm
);
6646 ParamTypes
.push_back(NewParm
->getType());
6649 const FunctionType
*BExprFunctionType
= E
->getFunctionType();
6650 QualType BExprResultType
= BExprFunctionType
->getResultType();
6651 if (!BExprResultType
.isNull()) {
6652 if (!BExprResultType
->isDependentType())
6653 CurBlock
->ReturnType
= BExprResultType
;
6654 else if (BExprResultType
!= SemaRef
.Context
.DependentTy
)
6655 CurBlock
->ReturnType
= getDerived().TransformType(BExprResultType
);
6658 // Transform the body
6659 StmtResult Body
= getDerived().TransformStmt(E
->getBody());
6660 if (Body
.isInvalid())
6662 // Set the parameters on the block decl.
6663 if (!Params
.empty())
6664 CurBlock
->TheDecl
->setParams(Params
.data(), Params
.size());
6666 QualType FunctionType
= getDerived().RebuildFunctionProtoType(
6667 CurBlock
->ReturnType
,
6672 BExprFunctionType
->getExtInfo());
6674 CurBlock
->FunctionType
= FunctionType
;
6675 return SemaRef
.ActOnBlockStmtExpr(CaretLoc
, Body
.get(), /*Scope=*/0);
6678 template<typename Derived
>
6680 TreeTransform
<Derived
>::TransformBlockDeclRefExpr(BlockDeclRefExpr
*E
) {
6681 NestedNameSpecifier
*Qualifier
= 0;
6684 = cast_or_null
<ValueDecl
>(getDerived().TransformDecl(E
->getLocation(),
6689 if (!getDerived().AlwaysRebuild() &&
6690 ND
== E
->getDecl()) {
6691 // Mark it referenced in the new context regardless.
6692 // FIXME: this is a bit instantiation-specific.
6693 SemaRef
.MarkDeclarationReferenced(E
->getLocation(), ND
);
6695 return SemaRef
.Owned(E
);
6698 DeclarationNameInfo
NameInfo(E
->getDecl()->getDeclName(), E
->getLocation());
6699 return getDerived().RebuildDeclRefExpr(Qualifier
, SourceLocation(),
6703 //===----------------------------------------------------------------------===//
6704 // Type reconstruction
6705 //===----------------------------------------------------------------------===//
6707 template<typename Derived
>
6708 QualType TreeTransform
<Derived
>::RebuildPointerType(QualType PointeeType
,
6709 SourceLocation Star
) {
6710 return SemaRef
.BuildPointerType(PointeeType
, Star
,
6711 getDerived().getBaseEntity());
6714 template<typename Derived
>
6715 QualType TreeTransform
<Derived
>::RebuildBlockPointerType(QualType PointeeType
,
6716 SourceLocation Star
) {
6717 return SemaRef
.BuildBlockPointerType(PointeeType
, Star
,
6718 getDerived().getBaseEntity());
6721 template<typename Derived
>
6723 TreeTransform
<Derived
>::RebuildReferenceType(QualType ReferentType
,
6724 bool WrittenAsLValue
,
6725 SourceLocation Sigil
) {
6726 return SemaRef
.BuildReferenceType(ReferentType
, WrittenAsLValue
,
6727 Sigil
, getDerived().getBaseEntity());
6730 template<typename Derived
>
6732 TreeTransform
<Derived
>::RebuildMemberPointerType(QualType PointeeType
,
6734 SourceLocation Sigil
) {
6735 return SemaRef
.BuildMemberPointerType(PointeeType
, ClassType
,
6736 Sigil
, getDerived().getBaseEntity());
6739 template<typename Derived
>
6741 TreeTransform
<Derived
>::RebuildArrayType(QualType ElementType
,
6742 ArrayType::ArraySizeModifier SizeMod
,
6743 const llvm::APInt
*Size
,
6745 unsigned IndexTypeQuals
,
6746 SourceRange BracketsRange
) {
6747 if (SizeExpr
|| !Size
)
6748 return SemaRef
.BuildArrayType(ElementType
, SizeMod
, SizeExpr
,
6749 IndexTypeQuals
, BracketsRange
,
6750 getDerived().getBaseEntity());
6752 QualType Types
[] = {
6753 SemaRef
.Context
.UnsignedCharTy
, SemaRef
.Context
.UnsignedShortTy
,
6754 SemaRef
.Context
.UnsignedIntTy
, SemaRef
.Context
.UnsignedLongTy
,
6755 SemaRef
.Context
.UnsignedLongLongTy
, SemaRef
.Context
.UnsignedInt128Ty
6757 const unsigned NumTypes
= sizeof(Types
) / sizeof(QualType
);
6759 for (unsigned I
= 0; I
!= NumTypes
; ++I
)
6760 if (Size
->getBitWidth() == SemaRef
.Context
.getIntWidth(Types
[I
])) {
6761 SizeType
= Types
[I
];
6765 IntegerLiteral
ArraySize(SemaRef
.Context
, *Size
, SizeType
,
6766 /*FIXME*/BracketsRange
.getBegin());
6767 return SemaRef
.BuildArrayType(ElementType
, SizeMod
, &ArraySize
,
6768 IndexTypeQuals
, BracketsRange
,
6769 getDerived().getBaseEntity());
6772 template<typename Derived
>
6774 TreeTransform
<Derived
>::RebuildConstantArrayType(QualType ElementType
,
6775 ArrayType::ArraySizeModifier SizeMod
,
6776 const llvm::APInt
&Size
,
6777 unsigned IndexTypeQuals
,
6778 SourceRange BracketsRange
) {
6779 return getDerived().RebuildArrayType(ElementType
, SizeMod
, &Size
, 0,
6780 IndexTypeQuals
, BracketsRange
);
6783 template<typename Derived
>
6785 TreeTransform
<Derived
>::RebuildIncompleteArrayType(QualType ElementType
,
6786 ArrayType::ArraySizeModifier SizeMod
,
6787 unsigned IndexTypeQuals
,
6788 SourceRange BracketsRange
) {
6789 return getDerived().RebuildArrayType(ElementType
, SizeMod
, 0, 0,
6790 IndexTypeQuals
, BracketsRange
);
6793 template<typename Derived
>
6795 TreeTransform
<Derived
>::RebuildVariableArrayType(QualType ElementType
,
6796 ArrayType::ArraySizeModifier SizeMod
,
6798 unsigned IndexTypeQuals
,
6799 SourceRange BracketsRange
) {
6800 return getDerived().RebuildArrayType(ElementType
, SizeMod
, 0,
6802 IndexTypeQuals
, BracketsRange
);
6805 template<typename Derived
>
6807 TreeTransform
<Derived
>::RebuildDependentSizedArrayType(QualType ElementType
,
6808 ArrayType::ArraySizeModifier SizeMod
,
6810 unsigned IndexTypeQuals
,
6811 SourceRange BracketsRange
) {
6812 return getDerived().RebuildArrayType(ElementType
, SizeMod
, 0,
6814 IndexTypeQuals
, BracketsRange
);
6817 template<typename Derived
>
6818 QualType TreeTransform
<Derived
>::RebuildVectorType(QualType ElementType
,
6819 unsigned NumElements
,
6820 VectorType::VectorKind VecKind
) {
6821 // FIXME: semantic checking!
6822 return SemaRef
.Context
.getVectorType(ElementType
, NumElements
, VecKind
);
6825 template<typename Derived
>
6826 QualType TreeTransform
<Derived
>::RebuildExtVectorType(QualType ElementType
,
6827 unsigned NumElements
,
6828 SourceLocation AttributeLoc
) {
6829 llvm::APInt
numElements(SemaRef
.Context
.getIntWidth(SemaRef
.Context
.IntTy
),
6831 IntegerLiteral
*VectorSize
6832 = IntegerLiteral::Create(SemaRef
.Context
, numElements
, SemaRef
.Context
.IntTy
,
6834 return SemaRef
.BuildExtVectorType(ElementType
, VectorSize
, AttributeLoc
);
6837 template<typename Derived
>
6839 TreeTransform
<Derived
>::RebuildDependentSizedExtVectorType(QualType ElementType
,
6841 SourceLocation AttributeLoc
) {
6842 return SemaRef
.BuildExtVectorType(ElementType
, SizeExpr
, AttributeLoc
);
6845 template<typename Derived
>
6846 QualType TreeTransform
<Derived
>::RebuildFunctionProtoType(QualType T
,
6847 QualType
*ParamTypes
,
6848 unsigned NumParamTypes
,
6851 const FunctionType::ExtInfo
&Info
) {
6852 return SemaRef
.BuildFunctionType(T
, ParamTypes
, NumParamTypes
, Variadic
,
6854 getDerived().getBaseLocation(),
6855 getDerived().getBaseEntity(),
6859 template<typename Derived
>
6860 QualType TreeTransform
<Derived
>::RebuildFunctionNoProtoType(QualType T
) {
6861 return SemaRef
.Context
.getFunctionNoProtoType(T
);
6864 template<typename Derived
>
6865 QualType TreeTransform
<Derived
>::RebuildUnresolvedUsingType(Decl
*D
) {
6866 assert(D
&& "no decl found");
6867 if (D
->isInvalidDecl()) return QualType();
6869 // FIXME: Doesn't account for ObjCInterfaceDecl!
6871 if (isa
<UsingDecl
>(D
)) {
6872 UsingDecl
*Using
= cast
<UsingDecl
>(D
);
6873 assert(Using
->isTypeName() &&
6874 "UnresolvedUsingTypenameDecl transformed to non-typename using");
6876 // A valid resolved using typename decl points to exactly one type decl.
6877 assert(++Using
->shadow_begin() == Using
->shadow_end());
6878 Ty
= cast
<TypeDecl
>((*Using
->shadow_begin())->getTargetDecl());
6881 assert(isa
<UnresolvedUsingTypenameDecl
>(D
) &&
6882 "UnresolvedUsingTypenameDecl transformed to non-using decl");
6883 Ty
= cast
<UnresolvedUsingTypenameDecl
>(D
);
6886 return SemaRef
.Context
.getTypeDeclType(Ty
);
6889 template<typename Derived
>
6890 QualType TreeTransform
<Derived
>::RebuildTypeOfExprType(Expr
*E
,
6891 SourceLocation Loc
) {
6892 return SemaRef
.BuildTypeofExprType(E
, Loc
);
6895 template<typename Derived
>
6896 QualType TreeTransform
<Derived
>::RebuildTypeOfType(QualType Underlying
) {
6897 return SemaRef
.Context
.getTypeOfType(Underlying
);
6900 template<typename Derived
>
6901 QualType TreeTransform
<Derived
>::RebuildDecltypeType(Expr
*E
,
6902 SourceLocation Loc
) {
6903 return SemaRef
.BuildDecltypeType(E
, Loc
);
6906 template<typename Derived
>
6907 QualType TreeTransform
<Derived
>::RebuildTemplateSpecializationType(
6908 TemplateName Template
,
6909 SourceLocation TemplateNameLoc
,
6910 const TemplateArgumentListInfo
&TemplateArgs
) {
6911 return SemaRef
.CheckTemplateIdType(Template
, TemplateNameLoc
, TemplateArgs
);
6914 template<typename Derived
>
6915 NestedNameSpecifier
*
6916 TreeTransform
<Derived
>::RebuildNestedNameSpecifier(NestedNameSpecifier
*Prefix
,
6919 QualType ObjectType
,
6920 NamedDecl
*FirstQualifierInScope
) {
6922 // FIXME: The source location information is all wrong.
6924 SS
.setScopeRep(Prefix
);
6925 return static_cast<NestedNameSpecifier
*>(
6926 SemaRef
.BuildCXXNestedNameSpecifier(0, SS
, Range
.getEnd(),
6929 FirstQualifierInScope
,
6933 template<typename Derived
>
6934 NestedNameSpecifier
*
6935 TreeTransform
<Derived
>::RebuildNestedNameSpecifier(NestedNameSpecifier
*Prefix
,
6937 NamespaceDecl
*NS
) {
6938 return NestedNameSpecifier::Create(SemaRef
.Context
, Prefix
, NS
);
6941 template<typename Derived
>
6942 NestedNameSpecifier
*
6943 TreeTransform
<Derived
>::RebuildNestedNameSpecifier(NestedNameSpecifier
*Prefix
,
6947 if (T
->isDependentType() || T
->isRecordType() ||
6948 (SemaRef
.getLangOptions().CPlusPlus0x
&& T
->isEnumeralType())) {
6949 assert(!T
.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6950 return NestedNameSpecifier::Create(SemaRef
.Context
, Prefix
, TemplateKW
,
6954 SemaRef
.Diag(Range
.getBegin(), diag::err_nested_name_spec_non_tag
) << T
;
6958 template<typename Derived
>
6960 TreeTransform
<Derived
>::RebuildTemplateName(NestedNameSpecifier
*Qualifier
,
6962 TemplateDecl
*Template
) {
6963 return SemaRef
.Context
.getQualifiedTemplateName(Qualifier
, TemplateKW
,
6967 template<typename Derived
>
6969 TreeTransform
<Derived
>::RebuildTemplateName(NestedNameSpecifier
*Qualifier
,
6970 SourceRange QualifierRange
,
6971 const IdentifierInfo
&II
,
6972 QualType ObjectType
,
6973 NamedDecl
*FirstQualifierInScope
) {
6975 SS
.setRange(QualifierRange
);
6976 SS
.setScopeRep(Qualifier
);
6978 Name
.setIdentifier(&II
, /*FIXME:*/getDerived().getBaseLocation());
6979 Sema::TemplateTy Template
;
6980 getSema().ActOnDependentTemplateName(/*Scope=*/0,
6981 /*FIXME:*/getDerived().getBaseLocation(),
6984 ParsedType::make(ObjectType
),
6985 /*EnteringContext=*/false,
6987 return Template
.get();
6990 template<typename Derived
>
6992 TreeTransform
<Derived
>::RebuildTemplateName(NestedNameSpecifier
*Qualifier
,
6993 OverloadedOperatorKind Operator
,
6994 QualType ObjectType
) {
6996 SS
.setRange(SourceRange(getDerived().getBaseLocation()));
6997 SS
.setScopeRep(Qualifier
);
6999 SourceLocation SymbolLocations
[3]; // FIXME: Bogus location information.
7000 Name
.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
7001 Operator
, SymbolLocations
);
7002 Sema::TemplateTy Template
;
7003 getSema().ActOnDependentTemplateName(/*Scope=*/0,
7004 /*FIXME:*/getDerived().getBaseLocation(),
7007 ParsedType::make(ObjectType
),
7008 /*EnteringContext=*/false,
7010 return Template
.template getAsVal
<TemplateName
>();
7013 template<typename Derived
>
7015 TreeTransform
<Derived
>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op
,
7016 SourceLocation OpLoc
,
7020 Expr
*Callee
= OrigCallee
->IgnoreParenCasts();
7021 bool isPostIncDec
= Second
&& (Op
== OO_PlusPlus
|| Op
== OO_MinusMinus
);
7023 // Determine whether this should be a builtin operation.
7024 if (Op
== OO_Subscript
) {
7025 if (!First
->getType()->isOverloadableType() &&
7026 !Second
->getType()->isOverloadableType())
7027 return getSema().CreateBuiltinArraySubscriptExpr(First
,
7028 Callee
->getLocStart(),
7030 } else if (Op
== OO_Arrow
) {
7031 // -> is never a builtin operation.
7032 return SemaRef
.BuildOverloadedArrowExpr(0, First
, OpLoc
);
7033 } else if (Second
== 0 || isPostIncDec
) {
7034 if (!First
->getType()->isOverloadableType()) {
7035 // The argument is not of overloadable type, so try to create a
7036 // built-in unary operation.
7037 UnaryOperatorKind Opc
7038 = UnaryOperator::getOverloadedOpcode(Op
, isPostIncDec
);
7040 return getSema().CreateBuiltinUnaryOp(OpLoc
, Opc
, First
);
7043 if (!First
->getType()->isOverloadableType() &&
7044 !Second
->getType()->isOverloadableType()) {
7045 // Neither of the arguments is an overloadable type, so try to
7046 // create a built-in binary operation.
7047 BinaryOperatorKind Opc
= BinaryOperator::getOverloadedOpcode(Op
);
7049 = SemaRef
.CreateBuiltinBinOp(OpLoc
, Opc
, First
, Second
);
7050 if (Result
.isInvalid())
7053 return move(Result
);
7057 // Compute the transformed set of functions (and function templates) to be
7058 // used during overload resolution.
7059 UnresolvedSet
<16> Functions
;
7061 if (UnresolvedLookupExpr
*ULE
= dyn_cast
<UnresolvedLookupExpr
>(Callee
)) {
7062 assert(ULE
->requiresADL());
7064 // FIXME: Do we have to check
7065 // IsAcceptableNonMemberOperatorCandidate for each of these?
7066 Functions
.append(ULE
->decls_begin(), ULE
->decls_end());
7068 Functions
.addDecl(cast
<DeclRefExpr
>(Callee
)->getDecl());
7071 // Add any functions found via argument-dependent lookup.
7072 Expr
*Args
[2] = { First
, Second
};
7073 unsigned NumArgs
= 1 + (Second
!= 0);
7075 // Create the overloaded operator invocation for unary operators.
7076 if (NumArgs
== 1 || isPostIncDec
) {
7077 UnaryOperatorKind Opc
7078 = UnaryOperator::getOverloadedOpcode(Op
, isPostIncDec
);
7079 return SemaRef
.CreateOverloadedUnaryOp(OpLoc
, Opc
, Functions
, First
);
7082 if (Op
== OO_Subscript
)
7083 return SemaRef
.CreateOverloadedArraySubscriptExpr(Callee
->getLocStart(),
7088 // Create the overloaded operator invocation for binary operators.
7089 BinaryOperatorKind Opc
= BinaryOperator::getOverloadedOpcode(Op
);
7091 = SemaRef
.CreateOverloadedBinOp(OpLoc
, Opc
, Functions
, Args
[0], Args
[1]);
7092 if (Result
.isInvalid())
7095 return move(Result
);
7098 template<typename Derived
>
7100 TreeTransform
<Derived
>::RebuildCXXPseudoDestructorExpr(Expr
*Base
,
7101 SourceLocation OperatorLoc
,
7103 NestedNameSpecifier
*Qualifier
,
7104 SourceRange QualifierRange
,
7105 TypeSourceInfo
*ScopeType
,
7106 SourceLocation CCLoc
,
7107 SourceLocation TildeLoc
,
7108 PseudoDestructorTypeStorage Destroyed
) {
7111 SS
.setRange(QualifierRange
);
7112 SS
.setScopeRep(Qualifier
);
7115 QualType BaseType
= Base
->getType();
7116 if (Base
->isTypeDependent() || Destroyed
.getIdentifier() ||
7117 (!isArrow
&& !BaseType
->getAs
<RecordType
>()) ||
7118 (isArrow
&& BaseType
->getAs
<PointerType
>() &&
7119 !BaseType
->getAs
<PointerType
>()->getPointeeType()
7120 ->template getAs
<RecordType
>())){
7121 // This pseudo-destructor expression is still a pseudo-destructor.
7122 return SemaRef
.BuildPseudoDestructorExpr(Base
, OperatorLoc
,
7123 isArrow
? tok::arrow
: tok::period
,
7124 SS
, ScopeType
, CCLoc
, TildeLoc
,
7129 TypeSourceInfo
*DestroyedType
= Destroyed
.getTypeSourceInfo();
7130 DeclarationName
Name(SemaRef
.Context
.DeclarationNames
.getCXXDestructorName(
7131 SemaRef
.Context
.getCanonicalType(DestroyedType
->getType())));
7132 DeclarationNameInfo
NameInfo(Name
, Destroyed
.getLocation());
7133 NameInfo
.setNamedTypeInfo(DestroyedType
);
7135 // FIXME: the ScopeType should be tacked onto SS.
7137 return getSema().BuildMemberReferenceExpr(Base
, BaseType
,
7138 OperatorLoc
, isArrow
,
7139 SS
, /*FIXME: FirstQualifier*/ 0,
7141 /*TemplateArgs*/ 0);
7144 } // end namespace clang
7146 #endif // LLVM_CLANG_SEMA_TREETRANSFORM_H