TreeTransform.h revision 016a4a90c8e75d59de731fa3aa98f0a55656e66c
10792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/
20792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//
30792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//                     The LLVM Compiler Infrastructure
40792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//
50792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang// This file is distributed under the University of Illinois Open Source
60792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang// License. See LICENSE.TXT for details.
70792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//===----------------------------------------------------------------------===/
80792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//
90792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//  This file implements a semantic tree transformation that takes a given
100792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//  AST and rebuilds it, possibly transforming some nodes in the process.
110792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//
120792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang//===----------------------------------------------------------------------===/
130792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
140792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang#define LLVM_CLANG_SEMA_TREETRANSFORM_H
150792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang
160792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang#include "Sema.h"
170792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang#include "Lookup.h"
180792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang#include "clang/Sema/SemaDiagnostic.h"
19ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim#include "clang/AST/Decl.h"
20ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim#include "clang/AST/Expr.h"
215008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/AST/ExprCXX.h"
225008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/AST/ExprObjC.h"
235008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/AST/Stmt.h"
245008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/AST/StmtCXX.h"
255008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/AST/StmtObjC.h"
265b8cb00b8a302329b98a5528eaa7934d0f5c3e65Jinsuk Kim#include "clang/AST/TypeLocBuilder.h"
275008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/Parse/Ownership.h"
285008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/Parse/Designator.h"
295008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include "clang/Lex/Preprocessor.h"
305b8cb00b8a302329b98a5528eaa7934d0f5c3e65Jinsuk Kim#include "llvm/Support/ErrorHandling.h"
315008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim#include <algorithm>
320792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang
3338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heonamespace clang {
347ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim
350792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang/// \brief A semantic tree transformation that allows one to transform one
3638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo/// abstract syntax tree into another.
3738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo///
385008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim/// A new tree transformation is defined by creating a new subclass \c X of
39c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim/// \c TreeTransform<X> and then overriding certain operations to provide
407d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo/// behavior specific to that transformation. For example, template
4160cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang/// instantiation is implemented as a tree transformation where the
420340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim/// transformation of TemplateTypeParmType nodes involves substituting the
43d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang/// template arguments for their corresponding template parameters; a similar
44d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang/// transformation is performed for non-type template parameters and
456d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim/// template template parameters.
46d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang///
479c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim/// This tree-transformation template uses static polymorphism to allow
48b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim/// subclasses to customize any of its operations. Thus, a subclass can
4912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang/// override any of the transformation or rebuild operators by providing an
50ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang/// operation with the same signature as the default implementation. The
51119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim/// overridding function should not be virtual.
52a858d221ff86c497e745222ea15bab141e337636Jungshik Jang///
537fa3a66470d2133796defd14a0600578758882acJinsuk Kim/// Semantic tree transformations are split into two stages, either of which
547fa3a66470d2133796defd14a0600578758882acJinsuk Kim/// can be replaced by a subclass. The "transform" step transforms an AST node
555008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim/// or the parts of an AST node using the various transformation functions,
5642c9800f4f3acef10d19dca39e8b739546407c04Jungshik Jang/// then passes the pieces on to the "rebuild" step, which constructs a new AST
5767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang/// node of the appropriate kind from the pieces. The default transformation
580792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang/// routines recursively transform the operands to composite AST nodes (e.g.,
5978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim/// the pointee type of a PointerType node) and, if any of those operand nodes
60e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang/// were changed by the transformation, invokes the rebuild operation to create
6138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo/// a new AST node.
6278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim///
6338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo/// Subclasses can customize the transformation at various levels. The
647d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo/// most coarse-grained transformations involve replacing TransformType(),
655008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
667ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim/// TransformTemplateName(), or TransformTemplateArgument() with entirely
677d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo/// new implementations.
682b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim///
690792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang/// For more fine-grained transformations, subclasses can replace any of the
703ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
718b308d93c8fdcc7304b33d9b445ae3807eae97c8Jungshik Jang/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
7278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim/// replacing TransformTemplateTypeParmType() allows template instantiation
734893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim/// to substitute template arguments for their corresponding template
74959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo/// parameters. Additionally, subclasses can override the \c RebuildXXX
750792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang/// functions to control how AST nodes are rebuilt when their operands change.
76a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang/// By default, \c TreeTransform will invoke semantic analysis to rebuild
773ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang/// AST nodes. However, certain other tree transformations (e.g, cloning) may
787e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim/// be able to use more efficient rebuild steps.
794fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang///
80f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim/// There are a handful of other functions that can be overridden, allowing one
81f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim/// to avoid traversing nodes that don't need any transformation
820792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
83b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang/// operands have not changed (\c AlwaysRebuild()), and customize the
84b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang/// default locations and entity names used for type-checking
85959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo/// (\c getBaseLocation(), \c getBaseEntity()).
86959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heotemplate<typename Derived>
8778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kimclass TreeTransform {
88f4eb72d53b4c5bc2286841006ad473ad4448bcf8Jinsuk Kimprotected:
890340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  Sema &SemaRef;
9002bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang
911ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heopublic:
92a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang  typedef Sema::OwningStmtResult OwningStmtResult;
930792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  typedef Sema::OwningExprResult OwningExprResult;
940792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  typedef Sema::StmtArg StmtArg;
950792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  typedef Sema::ExprArg ExprArg;
960792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  typedef Sema::MultiExprArg MultiExprArg;
970792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  typedef Sema::MultiStmtArg MultiStmtArg;
980792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  typedef Sema::DeclPtrTy DeclPtrTy;
995fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim
1005fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// \brief Initializes a new tree transformer.
1010792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
102c7eba0f1db8928ca779933a564a06989e22a8532Jinsuk Kim
10378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// \brief Retrieves a reference to the derived class.
104fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  Derived &getDerived() { return static_cast<Derived&>(*this); }
105fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo
106fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  /// \brief Retrieves a reference to the derived class.
107fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  const Derived &getDerived() const {
108fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo    return static_cast<const Derived&>(*this);
109b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  }
110fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo
111e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// \brief Retrieves a reference to the semantic analysis object used for
112e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// this tree transform.
113e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  Sema &getSema() const { return SemaRef; }
114e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim
115e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// \brief Whether the transformation should always rebuild AST nodes, even
116e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// if none of the children have changed.
117d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  ///
118d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// Subclasses may override this function to specify when the transformation
119d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// should rebuild all AST nodes.
120d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  bool AlwaysRebuild() { return false; }
121d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang
122d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// \brief Returns the location of the entity being transformed, if that
123d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// information was not available elsewhere in the AST.
124ece603b7955938d6001c376f351ca0a2219330acYuncheol Heo  ///
1254fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  /// By default, returns no source-location information. Subclasses can
1264fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  /// provide an alternative implementation that provides better location
1274fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  /// information.
1284fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  SourceLocation getBaseLocation() { return SourceLocation(); }
1294fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
130d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// \brief Returns the name of the entity being transformed, if that
131d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// information was not available elsewhere in the AST.
132d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  ///
133d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// By default, returns an empty name. Subclasses can provide an alternative
13402bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// implementation with a more precise name.
13502bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  DeclarationName getBaseEntity() { return DeclarationName(); }
13602bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang
13702bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// \brief Sets the "base" location and entity when that
13802bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// information is known based on another transformation.
13902bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  ///
14002bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// By default, the source location and entity are ignored. Subclasses can
14102bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// override this function to provide a customized implementation.
14202bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  void setBase(SourceLocation Loc, DeclarationName Entity) { }
14302bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang
14402bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// \brief RAII object that temporarily sets the base location and entity
14502bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// used for reporting diagnostics in types.
1461ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  class TemporaryBase {
147f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang    TreeTransform &Self;
14838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    SourceLocation OldLocation;
14938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    DeclarationName OldEntity;
150f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang
15138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  public:
15238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    TemporaryBase(TreeTransform &Self, SourceLocation Location,
15338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                  DeclarationName Entity) : Self(Self) {
154e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim      OldLocation = Self.getDerived().getBaseLocation();
15538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo      OldEntity = Self.getDerived().getBaseEntity();
15638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo      Self.getDerived().setBase(Location, Entity);
15738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    }
15838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
15938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    ~TemporaryBase() {
16038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo      Self.getDerived().setBase(OldLocation, OldEntity);
16138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    }
1621ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  };
1635fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim
1641ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  /// \brief Determine whether the given type \p T has already been
1651ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  /// transformed.
1661ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  ///
1671ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  /// Subclasses can provide an alternative implementation of this routine
168e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// to short-circuit evaluation when it is known that a given type will
169e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// not change. For example, template instantiation need not traverse
170e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// non-dependent types.
171e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  bool AlreadyTransformed(QualType T) {
172e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim    return T.isNull();
17338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  }
17438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
1755fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// \brief Determine whether the given call argument should be dropped, e.g.,
1765fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// because it is a default argument.
1775fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  ///
1785fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// Subclasses can provide an alternative implementation of this routine to
1795fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// determine which kinds of call arguments get dropped. By default,
1805fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// CXXDefaultArgument nodes are dropped (prior to transformation).
1815fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  bool DropCallArgument(Expr *E) {
1825fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim    return E->isDefaultArgument();
1835fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  }
1845fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim
1855fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  /// \brief Transforms the given type into another type.
1865fe3a6cbfc50a8faf9cf051f1f09a7eb1ef6b7eeJinsuk Kim  ///
18738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// By default, this routine transforms a type by creating a
18838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// TypeSourceInfo for it and delegating to the appropriate
1890792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// function.  This is expensive, but we don't mind, because
1900792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// this method is deprecated anyway;  all users should be
1910792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// switched to storing TypeSourceInfos.
1920792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  ///
1930792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// \returns the transformed type.
19478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  QualType TransformType(QualType T, QualType ObjectType = QualType());
19578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
19678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// \brief Transforms the given type-with-location into a new
1970340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// type-with-location.
1980340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
19978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, this routine transforms a type by delegating to the
20078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// appropriate TransformXXXType to build a new type.  Subclasses
2014893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  /// may override this function (to take over all type
20278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// transformations) or some set of the TransformXXXType functions
20378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// to alter the transformation.
20478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
205f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                QualType ObjectType = QualType());
2064893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim
2076d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// \brief Transform the given type-with-location into a new
2086d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// type, collecting location information in the given builder
2096d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// as necessary.
210f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  ///
211119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
212119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                         QualType ObjectType = QualType());
213119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
214119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// \brief Transform the given statement.
2159c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  ///
2169c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  /// By default, this routine transforms a statement by delegating to the
2179c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  /// appropriate TransformXXXStmt function to transform a specific kind of
218b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// statement or the TransformExpr() function to transform an expression.
21912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// Subclasses may override this function to transform statements using some
220b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// other mechanism.
22192b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim  ///
22292b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim  /// \returns the transformed statement.
22392b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim  OwningStmtResult TransformStmt(Stmt *S);
22492b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim
22592b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim  /// \brief Transform the given expression.
2264d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  ///
2274d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// By default, this routine transforms an expression by delegating to the
2284d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// appropriate TransformXXXExpr function to build a new expression.
2294d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// Subclasses may override this function to transform expressions using some
2304d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// other mechanism.
2314d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  ///
232ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// \returns the transformed expression.
233ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  OwningExprResult TransformExpr(Expr *E);
234ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
235ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// \brief Transform the given declaration, which is referenced from a type
2364893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  /// or expression.
2370340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
2380340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// By default, acts as the identity function on declarations. Subclasses
2395008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// may override this function to provide alternate behavior.
2405008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
241f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
242f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// \brief Transform the definition of the given declaration.
243f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  ///
2440792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// By default, invokes TransformDecl() to transform the declaration.
2450792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// Subclasses may override this function to provide alternate behavior.
2460792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
2470340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim    return getDerived().TransformDecl(Loc, D);
2480340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  }
2490340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim
2500340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// \brief Transform the given declaration, which was the first part of a
2512b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// nested-name-specifier in a member access expression.
25230c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim  ///
2532b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// This specific declaration transformation only applies to the first
2542b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// identifier in a nested-name-specifier of a member access expression, e.g.,
25530c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim  /// the \c T in \c x->T::member
2562b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  ///
257e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  /// By default, invokes TransformDecl() to transform the declaration.
258e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  /// Subclasses may override this function to provide alternate behavior.
259e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
26075a77e7d6cbfc287c6126efd28b338b48b7ea70cYuncheol Heo    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
26175a77e7d6cbfc287c6126efd28b338b48b7ea70cYuncheol Heo  }
26238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
263c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  /// \brief Transform the given nested-name-specifier.
26438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  ///
26538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// By default, transforms all of the types and declarations within the
2661ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  /// nested-name-specifier. Subclasses may override this function to provide
2671ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  /// alternate behavior.
2681ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
26938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                                    SourceRange Range,
27038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                              QualType ObjectType = QualType(),
271fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo                                          NamedDecl *FirstQualifierInScope = 0);
272fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo
273fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  /// \brief Transform the given declaration name.
274867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang  ///
275867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang  /// By default, transforms the types of conversion function, constructor,
276867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang  /// and destructor names and then (if needed) rebuilds the declaration name.
277f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// Identifiers and selectors are returned unmodified. Sublcasses may
278f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// override this function to provide alternate behavior.
279f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  DeclarationName TransformDeclarationName(DeclarationName Name,
280f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                           SourceLocation Loc,
281b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim                                           QualType ObjectType = QualType());
282f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim
283b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  /// \brief Transform the given template name.
284b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  ///
285f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// By default, transforms the template name by transforming the declarations
286f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// and nested-name-specifiers that occur within the template name.
287f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// Subclasses may override this function to provide alternate behavior.
288f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  TemplateName TransformTemplateName(TemplateName Name,
289f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                     QualType ObjectType = QualType());
290781041239f2931ca16c902fb371cd041b057c918Jinsuk Kim
291f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Transform the given template argument.
2927fa3a66470d2133796defd14a0600578758882acJinsuk Kim  ///
2937fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// By default, this operation transforms the type, expression, or
2947fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// declaration stored within the template argument and constructs a
295e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  /// new template argument from the transformed result. Subclasses may
296e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  /// override this function to provide alternate behavior.
297e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  ///
298f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// Returns true if there was an error.
299f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
300e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim                                 TemplateArgumentLoc &Output);
301e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
302e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
303e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
304964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                 TemplateArgumentLoc &ArgLoc);
305964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
306964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \brief Fakes up a TypeSourceInfo for a type.
307964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
308964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim    return SemaRef.Context.getTrivialTypeSourceInfo(T,
309964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                       getDerived().getBaseLocation());
310964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  }
311964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
312964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#define ABSTRACT_TYPELOC(CLASS, PARENT)
313964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#define TYPELOC(CLASS, PARENT)                                   \
314964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
315964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                  QualType ObjectType = QualType());
316964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#include "clang/AST/TypeLocNodes.def"
317964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
318964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \brief Transforms the parameters of a function type into the
319964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// given vectors.
320964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  ///
321964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// The result vectors should be kept in sync; null entries in the
322964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// variables vector are acceptable.
323964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  ///
324964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// Return true on error.
325964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
326964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                   llvm::SmallVectorImpl<QualType> &PTypes,
327964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
328964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
329964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \brief Transforms a single function-type parameter.  Return null
330964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// on error.
331964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
332964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
333964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
334964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                  QualType ObjectType);
335964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
336964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  QualType
337964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
338964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                      QualType ObjectType);
339964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
340964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
341964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
342964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
343964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#define STMT(Node, Parent)                        \
344964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  OwningStmtResult Transform##Node(Node *S);
345964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#define EXPR(Node, Parent)                        \
346964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  OwningExprResult Transform##Node(Node *E);
347964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#define ABSTRACT_STMT(Stmt)
348964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim#include "clang/AST/StmtNodes.inc"
349964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
350964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \brief Build a new pointer type given its pointee type.
351964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  ///
352964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// By default, performs semantic analysis when building the pointer type.
353964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
354964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
355964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
356964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \brief Build a new block pointer type given its pointee type.
357964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  ///
358964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// By default, performs semantic analysis when building the block pointer
359964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// type. Subclasses may override this routine to provide different behavior.
360964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
361964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
362964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \brief Build a new reference type given the type it references.
363964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  ///
364964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// By default, performs semantic analysis when building the
365f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim  /// reference type. Subclasses may override this routine to provide
366f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim  /// different behavior.
367f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim  ///
368964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  /// \param LValue whether the type was written with an lvalue sigil
3690792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// or an rvalue sigil.
3700792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  QualType RebuildReferenceType(QualType ReferentType,
3717d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo                                bool LValue,
3725008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                SourceLocation Sigil);
3730792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang
3740792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// \brief Build a new member pointer type given the pointee type and the
3757d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// class type it refers into.
3767d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  ///
3777d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// By default, performs semantic analysis when building the member pointer
3787d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// type. Subclasses may override this routine to provide different behavior.
3797d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
3807d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo                                    SourceLocation Sigil);
3817d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo
3827d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// \brief Build a new array type given the element type, size
3837d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// modifier, size of the array (if known), size expression, and index type
3847d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// qualifiers.
3857d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  ///
3867d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// By default, performs semantic analysis when building the array type.
3877d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
3887d9acc7a3eddb3e57c0b8312c3baf7ebb4f529d9Yuncheol Heo  /// Also by default, all of the other Rebuild*Array
3890792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  QualType RebuildArrayType(QualType ElementType,
3900792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang                            ArrayType::ArraySizeModifier SizeMod,
3912f51aec689226e259d08bf04d838251f249572e3Jungshik Jang                            const llvm::APInt *Size,
392c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                            Expr *SizeExpr,
3937ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim                            unsigned IndexTypeQuals,
3947ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim                            SourceRange BracketsRange);
39508a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo
3968b308d93c8fdcc7304b33d9b445ae3807eae97c8Jungshik Jang  /// \brief Build a new constant array type given the element type, size
397a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang  /// modifier, (known) size of the array, and index type qualifiers.
3983ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  ///
399a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang  /// By default, performs semantic analysis when building the array type.
400fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
401a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang  QualType RebuildConstantArrayType(QualType ElementType,
402a8a5e50c6f9ba3ae0ff59eda76354e93515d6f8fJinsuk Kim                                    ArrayType::ArraySizeModifier SizeMod,
4030792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang                                    const llvm::APInt &Size,
40408f1ab02d6de42756825a2dfa7027137ff959bd8Jinsuk Kim                                    unsigned IndexTypeQuals,
4050792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang                                    SourceRange BracketsRange);
4060792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang
407781041239f2931ca16c902fb371cd041b057c918Jinsuk Kim  /// \brief Build a new incomplete array type given the element type, size
408f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// modifier, and index type qualifiers.
4090792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  ///
4100792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang  /// By default, performs semantic analysis when building the array type.
411ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
412f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  QualType RebuildIncompleteArrayType(QualType ElementType,
413f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                      ArrayType::ArraySizeModifier SizeMod,
41475a77e7d6cbfc287c6126efd28b338b48b7ea70cYuncheol Heo                                      unsigned IndexTypeQuals,
4158692fc68a413c7aca75f094bb02bcbabcc277c73Jinsuk Kim                                      SourceRange BracketsRange);
41663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
417f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Build a new variable-length array type given the element type,
4180608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  /// size modifier, size expression, and index type qualifiers.
41938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  ///
42038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// By default, performs semantic analysis when building the array type.
42138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
4223059556f6092af0e292d4b3cff97ec772d2d6bd1Rob McConnell  QualType RebuildVariableArrayType(QualType ElementType,
4231ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo                                    ArrayType::ArraySizeModifier SizeMod,
4241ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo                                    ExprArg SizeExpr,
4250608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                                    unsigned IndexTypeQuals,
4260608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                                    SourceRange BracketsRange);
4270608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
42838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// \brief Build a new dependent-sized array type given the element type,
4295b8cb00b8a302329b98a5528eaa7934d0f5c3e65Jinsuk Kim  /// size modifier, size expression, and index type qualifiers.
4307ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim  ///
43138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  /// By default, performs semantic analysis when building the array type.
4327fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
4337fa3a66470d2133796defd14a0600578758882acJinsuk Kim  QualType RebuildDependentSizedArrayType(QualType ElementType,
4347fa3a66470d2133796defd14a0600578758882acJinsuk Kim                                          ArrayType::ArraySizeModifier SizeMod,
4357fa3a66470d2133796defd14a0600578758882acJinsuk Kim                                          ExprArg SizeExpr,
4367fa3a66470d2133796defd14a0600578758882acJinsuk Kim                                          unsigned IndexTypeQuals,
437e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim                                          SourceRange BracketsRange);
4387fa3a66470d2133796defd14a0600578758882acJinsuk Kim
4397fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// \brief Build a new vector type given the element type and
4407fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// number of elements.
4417fa3a66470d2133796defd14a0600578758882acJinsuk Kim  ///
4427fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// By default, performs semantic analysis when building the vector type.
4437fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
4447fa3a66470d2133796defd14a0600578758882acJinsuk Kim  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
4457fa3a66470d2133796defd14a0600578758882acJinsuk Kim    VectorType::AltiVecSpecific AltiVecSpec);
4467fa3a66470d2133796defd14a0600578758882acJinsuk Kim
4477fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// \brief Build a new extended vector type given the element type and
4487fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// number of elements.
4497fa3a66470d2133796defd14a0600578758882acJinsuk Kim  ///
4507fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// By default, performs semantic analysis when building the vector type.
4517fa3a66470d2133796defd14a0600578758882acJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
4527fa3a66470d2133796defd14a0600578758882acJinsuk Kim  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
4537fa3a66470d2133796defd14a0600578758882acJinsuk Kim                                SourceLocation AttributeLoc);
4547fa3a66470d2133796defd14a0600578758882acJinsuk Kim
455e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  /// \brief Build a new potentially dependently-sized extended vector type
456e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  /// given the element type and number of elements.
457e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  ///
458e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  /// By default, performs semantic analysis when building the vector type.
45925c20298ad04e0e591e0cfdc0bb9d01a985433abYuncheol Heo  /// Subclasses may override this routine to provide different behavior.
46025c20298ad04e0e591e0cfdc0bb9d01a985433abYuncheol Heo  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
46125c20298ad04e0e591e0cfdc0bb9d01a985433abYuncheol Heo                                              ExprArg SizeExpr,
4620608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                                              SourceLocation AttributeLoc);
463fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo
464fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  /// \brief Build a new function type.
465fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  ///
466fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  /// By default, performs semantic analysis when building the function type.
467fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
468de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  QualType RebuildFunctionProtoType(QualType T,
4695008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                    QualType *ParamTypes,
4700608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                                    unsigned NumParamTypes,
4710608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                                    bool Variadic, unsigned Quals);
4720608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
4730608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  /// \brief Build a new unprototyped function type.
4740608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  QualType RebuildFunctionNoProtoType(QualType ResultType);
4750608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
4760608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  /// \brief Rebuild an unresolved typename type, given the decl that
4770608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  /// the UnresolvedUsingTypenameDecl was transformed to.
4780608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  QualType RebuildUnresolvedUsingType(Decl *D);
4790608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
4800608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  /// \brief Build a new typedef type.
4810608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  QualType RebuildTypedefType(TypedefDecl *Typedef) {
4820608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo    return SemaRef.Context.getTypeDeclType(Typedef);
4830608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  }
4840608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
4850608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  /// \brief Build a new class/struct/union type.
48625c20298ad04e0e591e0cfdc0bb9d01a985433abYuncheol Heo  QualType RebuildRecordType(RecordDecl *Record) {
48725c20298ad04e0e591e0cfdc0bb9d01a985433abYuncheol Heo    return SemaRef.Context.getTypeDeclType(Record);
48825c20298ad04e0e591e0cfdc0bb9d01a985433abYuncheol Heo  }
4895008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
4905008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// \brief Build a new Enum type.
4915008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  QualType RebuildEnumType(EnumDecl *Enum) {
4925008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    return SemaRef.Context.getTypeDeclType(Enum);
4935008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  }
4945008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
4955008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// \brief Build a new typeof(expr) type.
4965008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  ///
4975008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// By default, performs semantic analysis when building the typeof type.
4985691b2f2297b29dc83a7f83f77da517035b11cceJungshik Jang  /// Subclasses may override this routine to provide different behavior.
4995008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  QualType RebuildTypeOfExprType(ExprArg Underlying);
5005008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
5015008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// \brief Build a new typeof(type) type.
5025008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  ///
5035008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// By default, builds a new TypeOfType with the given underlying type.
5045008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  QualType RebuildTypeOfType(QualType Underlying);
5055008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
5065008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// \brief Build a new C++0x decltype type.
5075008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  ///
5085008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// By default, performs semantic analysis when building the decltype type.
509f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang  /// Subclasses may override this routine to provide different behavior.
5105008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  QualType RebuildDecltypeType(ExprArg Underlying);
5115008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
5125008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// \brief Build a new template specialization type.
5135008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  ///
5145008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// By default, performs semantic analysis when building the template
5155008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// specialization type. Subclasses may override this routine to provide
5165008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// different behavior.
5175008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  QualType RebuildTemplateSpecializationType(TemplateName Template,
5185008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                             SourceLocation TemplateLoc,
519de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim                                       const TemplateArgumentListInfo &Args);
520de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim
521de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  /// \brief Build a new qualified name type.
522350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jang  ///
5235008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// By default, builds a new ElaboratedType type from the keyword,
5245008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// the nested-name-specifier and the named type.
525e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
526e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  QualType RebuildElaboratedType(ElaboratedTypeKeyword Keyword,
527dd371ec1a84f06a644e8c6f5179fd8bd5f11121bTerry Heo                                 NestedNameSpecifier *NNS, QualType Named) {
528dd371ec1a84f06a644e8c6f5179fd8bd5f11121bTerry Heo    return SemaRef.Context.getElaboratedType(Keyword, NNS, Named);
529dd371ec1a84f06a644e8c6f5179fd8bd5f11121bTerry Heo  }
530de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim
5315008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// \brief Build a new typename type that refers to a template-id.
5325008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  ///
5335008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// By default, builds a new DependentNameType type from the
53408a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo  /// nested-name-specifier and the given type. Subclasses may override
5355008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  /// this routine to provide different behavior.
5365008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  QualType RebuildDependentTemplateSpecializationType(
537f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                    ElaboratedTypeKeyword Keyword,
5385008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                    NestedNameSpecifier *NNS,
5395008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                    const IdentifierInfo *Name,
5405008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                    SourceLocation NameLoc,
5415008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                    const TemplateArgumentListInfo &Args) {
5425008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    // Rebuild the template name.
5435008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    // TODO: avoid TemplateName abstraction
5445008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    TemplateName InstName =
5455008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim      getDerived().RebuildTemplateName(NNS, *Name, QualType());
5465008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
5477ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim    if (InstName.isNull())
5487ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim      return QualType();
5495008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
5507ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim    // If it's still dependent, make a dependent specialization.
5517ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim    if (InstName.getAsDependentTemplateName())
5527ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim      return SemaRef.Context.getDependentTemplateSpecializationType(
5537ecfbaed6e902aea151bc1919cf7771bbd868fc4Jinsuk Kim                                          Keyword, NNS, Name, Args);
5545008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim
5555008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    // Otherwise, make an elaborated type wrapping a non-dependent
5565008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    // specialization.
557fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo    QualType T =
558964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim      getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
5595008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    if (T.isNull()) return QualType();
5605b8cb00b8a302329b98a5528eaa7934d0f5c3e65Jinsuk Kim
561b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
562a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang  }
563a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang
564a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// \brief Build a new typename type that refers to an identifier.
565b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  ///
566a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// By default, performs semantic analysis when building the typename type
567b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  /// (or elaborated type). Subclasses may override this routine to provide
568b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  /// different behavior.
569b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5706f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim                                    NestedNameSpecifier *NNS,
5716f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim                                    const IdentifierInfo *Id,
5726f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim                                    SourceLocation KeywordLoc,
5736f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim                                    SourceRange NNSRange,
5743ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                    SourceLocation IdLoc) {
575b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    CXXScopeSpec SS;
576b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    SS.setScopeRep(NNS);
5776f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim    SS.setRange(NNSRange);
5786f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim
5796f87b4e6b6db76cb32d449ad1fdf1946ff4e96f7Jinsuk Kim    if (NNS->isDependent()) {
580b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo      // If the name is still dependent, just build a new dependent name type.
581b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo      if (!SemaRef.computeDeclContext(SS))
582b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
583b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    }
584b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo
585b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    if (Keyword == ETK_None || Keyword == ETK_Typename)
586b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo      return SemaRef.CheckTypenameType(Keyword, NNS, *Id,
58789ec14e48f4a1bdf291cda9fba7b8172f55a2447Yuncheol Heo                                       KeywordLoc, NNSRange, IdLoc);
588b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo
589b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
590964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim
591964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim    // We had a dependent elaborated-type-specifier that has been transformed
592f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    // into a non-dependent elaborated-type-specifier. Find the tag we're
593f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    // referring to.
594f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
595f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
596f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    if (!DC)
597f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim      return QualType();
598b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo
599b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    if (SemaRef.RequireCompleteDeclContext(SS, DC))
6003ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang      return QualType();
6013ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang
6023ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang    TagDecl *Tag = 0;
603c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim    SemaRef.LookupQualifiedName(Result, DC);
6043ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang    switch (Result.getResultKind()) {
6053ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang      case LookupResult::NotFound:
606410ca9c7a4a2d69af5c81e76320433bfda05cafeJungshik Jang      case LookupResult::NotFoundInCurrentInstantiation:
607410ca9c7a4a2d69af5c81e76320433bfda05cafeJungshik Jang        break;
608410ca9c7a4a2d69af5c81e76320433bfda05cafeJungshik Jang
609410ca9c7a4a2d69af5c81e76320433bfda05cafeJungshik Jang      case LookupResult::Found:
6103ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang        Tag = Result.getAsSingle<TagDecl>();
6113ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang        break;
6123ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang
613b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo      case LookupResult::FoundOverloaded:
6143ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang      case LookupResult::FoundUnresolvedValue:
6153ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang        llvm_unreachable("Tag lookup cannot find non-tags");
6164893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim        return QualType();
617b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo
618964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim      case LookupResult::Ambiguous:
619b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo        // Let the LookupResult structure handle ambiguities.
620b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo        return QualType();
621b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    }
6220608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
623b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    if (!Tag) {
624b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo      // FIXME: Would be nice to highlight just the source range.
625964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim      SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
6263ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang        << Kind << Id << DC;
6273ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang      return QualType();
6283ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang    }
6293ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang
6303ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
6313ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
632a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
633b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo      return QualType();
634a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang    }
635b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo
636b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo    // Build the elaborated-type-specifier type.
637fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo    QualType T = SemaRef.Context.getTypeDeclType(Tag);
6383ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
639f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim  }
640f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim
641f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim  /// \brief Build a new nested-name-specifier given the prefix and an
6423ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  /// identifier that names the next step in the nested-name-specifier.
6433ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  ///
6440340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// By default, performs semantic analysis when building the new
6450340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// nested-name-specifier. Subclasses may override this routine to provide
646a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// different behavior.
6472b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
648a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang                                                  SourceRange Range,
6490340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                                  IdentifierInfo &II,
6500340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                                  QualType ObjectType,
6510340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                              NamedDecl *FirstQualifierInScope);
6520340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim
6530340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// \brief Build a new nested-name-specifier given the prefix and the
6540340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// namespace named in the next step in the nested-name-specifier.
6550340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
6560340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// By default, performs semantic analysis when building the new
6572b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// nested-name-specifier. Subclasses may override this routine to provide
6582b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// different behavior.
6592b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
66030c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim                                                  SourceRange Range,
66130c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim                                                  NamespaceDecl *NS);
662e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
6632b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// \brief Build a new nested-name-specifier given the prefix and the
66430c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim  /// type named in the next step in the nested-name-specifier.
66530c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim  ///
666e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  /// By default, performs semantic analysis when building the new
6670340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// nested-name-specifier. Subclasses may override this routine to provide
66830c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim  /// different behavior.
66930c74d9ba60a7208a587ecd6dcdfef1cfbd7fce7Jinsuk Kim  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
670e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim                                                  SourceRange Range,
6710340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                                  bool TemplateKW,
672f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                                  QualType T);
673f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim
674f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Build a new template name given a nested name specifier, a flag
675f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// indicating whether the "template" keyword was provided, and the template
676f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// that the template name refers to.
6770340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
678f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// By default, builds the new template name directly. Subclasses may override
6790340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// this routine to provide different behavior.
680f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
681f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                   bool TemplateKW,
682f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                   TemplateDecl *Template);
683f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim
684f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Build a new template name given a nested name specifier and the
685f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// name that is referred to as a template.
686f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  ///
687f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// By default, performs semantic analysis to determine whether the name can
688f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// be resolved to a specific template, then builds the appropriate kind of
689f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// template name. Subclasses may override this routine to provide different
690f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// behavior.
691f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
692f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                   const IdentifierInfo &II,
6932b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim                                   QualType ObjectType);
6942b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim
695f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Build a new template name given a nested name specifier and the
6960340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// overloaded operator name that is referred to as a template.
6970340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
6982738e2d872a22fe95a99941139863ff642fbd8e7Jungshik Jang  /// By default, performs semantic analysis to determine whether the name can
6992738e2d872a22fe95a99941139863ff642fbd8e7Jungshik Jang  /// be resolved to a specific template, then builds the appropriate kind of
7002738e2d872a22fe95a99941139863ff642fbd8e7Jungshik Jang  /// template name. Subclasses may override this routine to provide different
7012738e2d872a22fe95a99941139863ff642fbd8e7Jungshik Jang  /// behavior.
7020340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
7030340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                   OverloadedOperatorKind Operator,
7040340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                   QualType ObjectType);
7050340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim
7060340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// \brief Build a new compound statement.
7070340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
7080340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// By default, performs semantic analysis to build the new statement.
7092b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
7100340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
7110340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                       MultiStmtArg Statements,
712e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang                                       SourceLocation RBraceLoc,
713401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                       bool IsStmtExpr) {
714401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
715401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                       IsStmtExpr);
716401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  }
717401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim
718401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  /// \brief Build a new case statement.
719401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  ///
720c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  /// By default, performs semantic analysis to build the new statement.
721401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
722401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
723401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                   ExprArg LHS,
724401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                   SourceLocation EllipsisLoc,
725401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                   ExprArg RHS,
726401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                   SourceLocation ColonLoc) {
727401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
728401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim                                   ColonLoc);
729401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  }
730401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim
731401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  /// \brief Attach the body to a new case statement.
732c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  ///
7332b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim  /// By default, performs semantic analysis to build the new statement.
734401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
735401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
73609ffc846af78f949d2847003db9f793bfb5eefaaJinsuk Kim    getSema().ActOnCaseStmtBody(S.get(), move(Body));
7372b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim    return move(S);
73809ffc846af78f949d2847003db9f793bfb5eefaaJinsuk Kim  }
73909ffc846af78f949d2847003db9f793bfb5eefaaJinsuk Kim
740401e3de791c0e2a4348361fbd560da9530156e22Jinsuk Kim  /// \brief Build a new default statement.
741e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  ///
742e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
743e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
744e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
745e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang                                      SourceLocation ColonLoc,
746e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang                                      StmtArg SubStmt) {
747e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
748e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang                                      /*CurScope=*/0);
749e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  }
750e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang
751e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  /// \brief Build a new label statement.
752e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  ///
753e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
754e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
755e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                    IdentifierInfo *Id,
757e9c77c88ea34a66f83a94f960547275c0ff6bd07Jungshik Jang                                    SourceLocation ColonLoc,
758c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim                                    StmtArg SubStmt) {
759c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
7603ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  }
7613ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang
7623ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  /// \brief Build a new "if" statement.
7633ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  ///
7643ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
7653ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
7663ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
7673ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                 VarDecl *CondVar, StmtArg Then,
7683ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                 SourceLocation ElseLoc, StmtArg Else) {
7693ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang    return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar),
7703ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                 move(Then), ElseLoc, move(Else));
7713ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  }
7723ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang
773a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// \brief Start building a new switch statement.
77461f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang  ///
7750340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// By default, performs semantic analysis to build the new statement.
776de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
777a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim  OwningStmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
778a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim                                          Sema::ExprArg Cond,
7796ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim                                          VarDecl *CondVar) {
7806ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, move(Cond),
7816ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim                                            DeclPtrTy::make(CondVar));
7826ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim  }
7836ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim
7846ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim  /// \brief Attach the body to the switch statement.
7856ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim  ///
7866ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim  /// By default, performs semantic analysis to build the new statement.
7876ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
7886ad7cbde22fe9752082ce01c9b9be213b07afefcJinsuk Kim  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
7893ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                         StmtArg Switch, StmtArg Body) {
790092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
791092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang                                         move(Body));
792092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  }
793092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang
794092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  /// \brief Build a new while statement.
795092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  ///
796092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
79760cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// Subclasses may override this routine to provide different behavior.
79860cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
79960cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                    Sema::FullExprArg Cond,
800339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                                    VarDecl *CondVar,
8012b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim                                    StmtArg Body) {
8022b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim    return getSema().ActOnWhileStmt(WhileLoc, Cond,
80360cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                    DeclPtrTy::make(CondVar), move(Body));
80460cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  }
80560cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang
80660cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// \brief Build a new do-while statement.
8077b0cf6413218e5b5c549eea31733222fcffafabcJinsuk Kim  ///
8087b0cf6413218e5b5c549eea31733222fcffafabcJinsuk Kim  /// By default, performs semantic analysis to build the new statement.
8097b0cf6413218e5b5c549eea31733222fcffafabcJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
8107b0cf6413218e5b5c549eea31733222fcffafabcJinsuk Kim  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
8117b0cf6413218e5b5c549eea31733222fcffafabcJinsuk Kim                                 SourceLocation WhileLoc,
8127b0cf6413218e5b5c549eea31733222fcffafabcJinsuk Kim                                 SourceLocation LParenLoc,
81379c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                 ExprArg Cond,
81467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                 SourceLocation RParenLoc) {
81567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
81667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                 move(Cond), RParenLoc);
81763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo  }
81863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
81963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo  /// \brief Build a new for statement.
82063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo  ///
82163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo  /// By default, performs semantic analysis to build the new statement.
82263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo  /// Subclasses may override this routine to provide different behavior.
82363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
82463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                                  SourceLocation LParenLoc,
82563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                                  StmtArg Init, Sema::FullExprArg Cond,
82663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                                  VarDecl *CondVar, Sema::FullExprArg Inc,
82767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                  SourceLocation RParenLoc, StmtArg Body) {
828c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
829c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim                                  DeclPtrTy::make(CondVar),
830c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim                                  Inc, RParenLoc, move(Body));
831d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  }
832c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim
833a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// \brief Build a new goto statement.
834d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  ///
835a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
8364c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo  /// Subclasses may override this routine to provide different behavior.
8375f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
8385f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang                                   SourceLocation LabelLoc,
8392e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang                                   LabelStmt *Label) {
8405f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
8415f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang  }
8425f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang
8435f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang  /// \brief Build a new indirect goto statement.
844d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  ///
845d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
846a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
847d643f764f72efc1e7aa67392bf9ac40720ae14c3Jungshik Jang  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
848a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang                                           SourceLocation StarLoc,
8495f75cbd8593e83eaf17cfac07186a3b6a7b7b1f1Jungshik Jang                                           ExprArg Target) {
850c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
851c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim  }
8526aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo
8536aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  /// \brief Build a new return statement.
8546aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  ///
8556aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  /// By default, performs semantic analysis to build the new statement.
8566aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
8576aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
8586aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo                                     ExprArg Result) {
8596aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo
8606aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
8616aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  }
8626aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo
8636aae6528a6672497b1d1dffb5c083093d5c46dc8Yuncheol Heo  /// \brief Build a new declaration statement.
864a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  ///
865a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
866a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
867964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
868964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                   SourceLocation StartLoc,
869964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim                                   SourceLocation EndLoc) {
870964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim    return getSema().Owned(
8714c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo             new (getSema().Context) DeclStmt(
8724c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo                                        DeclGroupRef::Create(getSema().Context,
873a95f1a9b89ba321f39fd9926388d157f831db9b2Yuncheol Heo                                                             Decls, NumDecls),
874a95f1a9b89ba321f39fd9926388d157f831db9b2Yuncheol Heo                                              StartLoc, EndLoc));
8754c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo  }
8764c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo
8774c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo  /// \brief Build a new inline asm statement.
8784c212897813d6c23b2e7ffba4a4c01e13a41b1faYuncheol Heo  ///
87975a77e7d6cbfc287c6126efd28b338b48b7ea70cYuncheol Heo  /// By default, performs semantic analysis to build the new statement.
880092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
881092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
882092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang                                  bool IsSimple,
8831481a4282818939436f590d8c88aea2d19166b8eJinsuk Kim                                  bool IsVolatile,
8841481a4282818939436f590d8c88aea2d19166b8eJinsuk Kim                                  unsigned NumOutputs,
88560cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                  unsigned NumInputs,
88660cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                  IdentifierInfo **Names,
887a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang                                  MultiExprArg Constraints,
888092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang                                  MultiExprArg Exprs,
889a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang                                  ExprArg AsmString,
890092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang                                  MultiExprArg Clobbers,
89179c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                  SourceLocation RParenLoc,
892c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                                  bool MSAsm) {
893092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
894092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang                                  NumInputs, Names, move(Constraints),
895092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang                                  move(Exprs), move(AsmString), move(Clobbers),
89660cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                  RParenLoc, MSAsm);
897c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  }
8982e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang
8993a959fca91bce393cc1ee79aa2985bb06542016eJungshik Jang  /// \brief Build a new Objective-C @try statement.
900092b445ef898e3c1e5b2918b554480940f0f5a28Jungshik Jang  ///
901a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
902a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
90367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang  OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
90467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                        StmtArg TryBody,
90567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                        MultiStmtArg CatchStmts,
906ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                        StmtArg Finally) {
90767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts),
90867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                        move(Finally));
909a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  }
910ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim
91160cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// \brief Rebuild an Objective-C exception declaration.
912b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  ///
913b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo  /// By default, performs semantic analysis to build the new declaration.
914b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
915b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
916b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo                                    TypeSourceInfo *TInfo, QualType T) {
917b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo    return getSema().BuildObjCExceptionDecl(TInfo, T,
918b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo                                            ExceptionDecl->getIdentifier(),
919b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo                                            ExceptionDecl->getLocation());
920b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo  }
921b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo
922b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  /// \brief Build a new Objective-C @catch statement.
923b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo  ///
924b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  /// By default, performs semantic analysis to build the new statement.
925b502186ab34a4de40f1d98591a0c5d8b4eac76e2Yuncheol Heo  /// Subclasses may override this routine to provide different behavior.
92679c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang  OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
927ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                          SourceLocation RParenLoc,
92860cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                          VarDecl *Var,
929ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                          StmtArg Body) {
93067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
93167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                                          Sema::DeclPtrTy::make(Var),
93202bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang                                          move(Body));
93302bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  }
93402bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang
93502bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  /// \brief Build a new Objective-C @finally statement.
93602bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  ///
9371de514256fd3015cf45256f3198ab5472024af9bJungshik Jang  /// By default, performs semantic analysis to build the new statement.
9380f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
93902bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang  OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9400f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang                                            StmtArg Body) {
94102bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang    return getSema().ActOnObjCAtFinallyStmt(AtLoc, move(Body));
942a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  }
9431de514256fd3015cf45256f3198ab5472024af9bJungshik Jang
9441de514256fd3015cf45256f3198ab5472024af9bJungshik Jang  /// \brief Build a new Objective-C @throw statement.
945a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  ///
9461de514256fd3015cf45256f3198ab5472024af9bJungshik Jang  /// By default, performs semantic analysis to build the new statement.
9471de514256fd3015cf45256f3198ab5472024af9bJungshik Jang  /// Subclasses may override this routine to provide different behavior.
9480f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang  OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
9490f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang                                          ExprArg Operand) {
9500f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang    return getSema().BuildObjCAtThrowStmt(AtLoc, move(Operand));
951c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  }
9520f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang
9530f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang  /// \brief Build a new Objective-C @synchronized statement.
9540f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang  ///
955c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  /// By default, performs semantic analysis to build the new statement.
9560f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
9570f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang  OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9580f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang                                                 ExprArg Object,
9590f8b4b770c49b83fa8260833d8e1ec5c721a05d3Jungshik Jang                                                 StmtArg Body) {
96002bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, move(Object),
96102bb4265ac41e1974ec7d4793e6c2a0ed2adc3c4Jungshik Jang                                                 move(Body));
96260cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  }
96360cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang
96460cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// \brief Build a new Objective-C fast enumeration statement.
96560cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  ///
96660cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// By default, performs semantic analysis to build the new statement.
96779c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
96879c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang  OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
96979c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                                SourceLocation LParenLoc,
97079c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                                StmtArg Element,
97179c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                                ExprArg Collection,
972b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                                SourceLocation RParenLoc,
973b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                                StmtArg Body) {
974b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
975b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                                move(Element),
976b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                                move(Collection),
977b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                                RParenLoc,
978b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                                move(Body));
979b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang  }
980b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang
981b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang  /// \brief Build a new C++ exception declaration.
982b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang  ///
983b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang  /// By default, performs semantic analysis to build the new decaration.
984b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
9851a6be6ed3962735f12dbd5ce1bca758120c8fb8dJungshik Jang  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
986b69aafbfaddd8a6ac84b366b5db640cdd7e95354Jungshik Jang                                TypeSourceInfo *Declarator,
9873ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                IdentifierInfo *Name,
9883ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang                                SourceLocation Loc,
989ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                SourceRange TypeRange) {
990f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
991f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                               TypeRange);
992f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  }
993f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
994f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// \brief Build a new C++ catch statement.
995ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  ///
996ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
997ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
998410ca9c7a4a2d69af5c81e76320433bfda05cafeJungshik Jang  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
99942c9800f4f3acef10d19dca39e8b739546407c04Jungshik Jang                                       VarDecl *ExceptionDecl,
100042c9800f4f3acef10d19dca39e8b739546407c04Jungshik Jang                                       StmtArg Handler) {
100161f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang    return getSema().Owned(
10022b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
10032b152015ff94f20b9ec3ef284fb83105f8b3c831Jinsuk Kim                                                  Handler.takeAs<Stmt>()));
10043ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang  }
10053ee65720e91c7f92ad5a034d7052122a606aa8d5Jungshik Jang
10067df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// \brief Build a new C++ try statement.
10077df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  ///
10087df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// By default, performs semantic analysis to build the new statement.
100993eed0c03a1f9cd66946760045122516483ba3f0Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
10107df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
10113b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim                                     StmtArg TryBlock,
10123b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim                                     MultiStmtArg Handlers) {
10137df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
10147df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  }
10157df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
10167df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// \brief Build a new expression that references a declaration.
101793eed0c03a1f9cd66946760045122516483ba3f0Jinsuk Kim  ///
101893eed0c03a1f9cd66946760045122516483ba3f0Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
10197df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
10203b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
10217df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                              LookupResult &R,
10227df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                              bool RequiresADL) {
102393eed0c03a1f9cd66946760045122516483ba3f0Jinsuk Kim    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
102493eed0c03a1f9cd66946760045122516483ba3f0Jinsuk Kim  }
10257df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
10267df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
10277df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// \brief Build a new expression that references a declaration.
10287df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  ///
1029ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
10307df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
10317df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
10327df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                      SourceRange QualifierRange,
1033a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim                                      ValueDecl *VD, SourceLocation Loc,
10347df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                      TemplateArgumentListInfo *TemplateArgs) {
10353b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim    CXXScopeSpec SS;
10367df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang    SS.setScopeRep(Qualifier);
1037a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim    SS.setRange(QualifierRange);
10387df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
1039a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim    // FIXME: loses template args.
1040a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim
10417df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang    return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
10427df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  }
10437df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
10447df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// \brief Build a new expression in parentheses.
1045a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim  ///
10467df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
10473b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
10487df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
1049a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim                                    SourceLocation RParen) {
10507df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
1051a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim  }
10527df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
10537df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// \brief Build a new pseudo-destructor expression.
10547df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  ///
10557df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
1056a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
10577df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
10583b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim                                                  SourceLocation OperatorLoc,
1059ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                                  bool isArrow,
10607df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                                NestedNameSpecifier *Qualifier,
1061a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim                                                  SourceRange QualifierRange,
10627df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                                  TypeSourceInfo *ScopeType,
1063a94417a51646a2560e44974c99435cb00bd96201Jinsuk Kim                                                  SourceLocation CCLoc,
10647df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                                  SourceLocation TildeLoc,
10657df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang                                        PseudoDestructorTypeStorage Destroyed);
10667df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang
10677df52862dae1fa33c84725c613b0d9b88c1b28b6Jungshik Jang  /// \brief Build a new unary operator expression.
1068ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  ///
1069ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1070ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1071ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
10723b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim                                        UnaryOperator::Opcode Opc,
1073ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                        ExprArg SubExpr) {
10743b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
1075ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  }
1076ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim
1077ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// \brief Build a new builtin offsetof expression.
1078ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  ///
1079ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1080ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1081ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  OwningExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1082ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                       TypeSourceInfo *Type,
1083ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                       Action::OffsetOfComponent *Components,
1084ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                       unsigned NumComponents,
1085ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                       SourceLocation RParenLoc) {
1086ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1087ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim                                          NumComponents, RParenLoc);
1088ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  }
1089ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim
1090ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// \brief Build a new sizeof or alignof expression with a type argument.
1091ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  ///
1092b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1093b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1094f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
1095b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim                                        SourceLocation OpLoc,
1096f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                        bool isSizeOf, SourceRange R) {
1097f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1098f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  }
1099f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim
1100f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Build a new sizeof or alignof expression with an expression
1101b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  /// argument.
1102f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  ///
1103f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1104f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
110578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
110678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                        bool isSizeOf, SourceRange R) {
110778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    OwningExprResult Result
110878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
110978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                          OpLoc, isSizeOf, R);
111078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    if (Result.isInvalid())
111178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim      return getSema().ExprError();
111278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
111378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    SubExpr.release();
111478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    return move(Result);
111578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  }
111678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
111778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// \brief Build a new array subscript expression.
111878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  ///
111978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
11203cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
11213cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
11223cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                             SourceLocation LBracketLoc,
11233cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                             ExprArg RHS,
11243cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                             SourceLocation RBracketLoc) {
11253cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
11263cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                             LBracketLoc, move(RHS),
11273cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                             RBracketLoc);
11283cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  }
11293cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim
11303cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  /// \brief Build a new call expression.
11313cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  ///
11323cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
113378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
113478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
11356d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                   MultiExprArg Args,
11366d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                   SourceLocation *CommaLocs,
11376d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                   SourceLocation RParenLoc) {
11386d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
11396d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                   move(Args), CommaLocs, RParenLoc);
11406d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  }
11416d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim
11426d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// \brief Build a new member access expression.
1143ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  ///
11446d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
11456d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
11466d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
11476d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                     bool isArrow,
11486d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                     NestedNameSpecifier *Qualifier,
11496d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                     SourceRange QualifierRange,
1150ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     SourceLocation MemberLoc,
115138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                     ValueDecl *Member,
1152ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     NamedDecl *FoundDecl,
1153ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
1154ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     NamedDecl *FirstQualifierInScope) {
1155ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    if (!Member->getDeclName()) {
1156ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      // We have a reference to an unnamed field.
1157ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
1158ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1159ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      Expr *BaseExpr = Base.takeAs<Expr>();
1160ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier,
1161ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                  FoundDecl, Member))
1162ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang        return getSema().ExprError();
1163ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1164ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      MemberExpr *ME =
1165119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
1166119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                           Member, MemberLoc,
1167119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                           cast<FieldDecl>(Member)->getType());
1168119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim      return getSema().Owned(ME);
1169119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
1170119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
1171119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    CXXScopeSpec SS;
1172119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    if (Qualifier) {
1173119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim      SS.setRange(QualifierRange);
1174119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim      SS.setScopeRep(Qualifier);
1175119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
1176119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
1177119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    Expr *BaseExpr = Base.takeAs<Expr>();
1178119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    getSema().DefaultFunctionArrayConversion(BaseExpr);
1179119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    QualType BaseType = BaseExpr->getType();
1180119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
1181119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    // FIXME: this involves duplicating earlier analysis in a lot of
118212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    // cases; we should avoid this when possible.
1183f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    LookupResult R(getSema(), Member->getDeclName(), MemberLoc,
1184f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                   Sema::LookupMemberName);
1185f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    R.addDecl(FoundDecl);
1186f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    R.resolveKind();
1187f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
1188f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    return getSema().BuildMemberReferenceExpr(getSema().Owned(BaseExpr),
1189b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                              BaseType, OpLoc, isArrow,
1190b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                              SS, FirstQualifierInScope,
1191b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                              R, ExplicitTemplateArgs);
1192f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  }
1193b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang
1194b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// \brief Build a new binary operator expression.
1195b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  ///
1196b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// By default, performs semantic analysis to build the new expression.
119778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
119878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
119978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                         BinaryOperator::Opcode Opc,
120078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                         ExprArg LHS, ExprArg RHS) {
120178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
120278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
120378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  }
120478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
12050340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// \brief Build a new conditional operator expression.
12060340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  ///
12070340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
12080340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
120978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
12100340bbc89f8162f9c2a298c98b03bfcdd1bc6e87Jinsuk Kim                                              SourceLocation QuestionLoc,
121178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                              ExprArg LHS,
121278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                              SourceLocation ColonLoc,
121378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                              ExprArg RHS) {
121461f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1215b22d9ee0a364b10d488dd6a2e8ba69d5ca7f6258Jinsuk Kim                                        move(LHS), move(RHS));
12167e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  }
12177e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim
12187e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  /// \brief Build a new C-style cast expression.
12197e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  ///
12207e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
12217e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
12227e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
122361f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang                                         TypeSourceInfo *TInfo,
122461f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang                                         SourceLocation RParenLoc,
122561f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang                                         ExprArg SubExpr) {
12267e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
12277e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim                                         move(SubExpr));
122861f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang  }
12297640d9895cf8fae7a99a7db5bba0079ba6022621Jinsuk Kim
1230d47abefc8269dae7fdfa2bb102bcb89cbea7c7b0Jinsuk Kim  /// \brief Build a new compound literal expression.
12317e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  ///
12327e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
12337e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
12347e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
12357e74206693f4ee93afb902d5b3446e2384f2a13dJinsuk Kim                                              TypeSourceInfo *TInfo,
12368960d1b1552729e3dfd33deee951ac75933ad8e5Jinsuk Kim                                              SourceLocation RParenLoc,
1237a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim                                              ExprArg Init) {
1238a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1239a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim                                              move(Init));
1240a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim  }
124172b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim
124272b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim  /// \brief Build a new extended vector element access expression.
124372b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim  ///
124472b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
124579c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
1246a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1247f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                               SourceLocation OpLoc,
1248f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                               SourceLocation AccessorLoc,
1249f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                               IdentifierInfo &Accessor) {
1250f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim
1251f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    CXXScopeSpec SS;
1252a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    QualType BaseType = ((Expr*) Base.get())->getType();
1253c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1254a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim                                              OpLoc, /*IsArrow*/ false,
1255a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim                                              SS, /*FirstQualifierInScope*/ 0,
12563b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim                                              DeclarationName(&Accessor),
1257f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                              AccessorLoc,
1258f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                              /* TemplateArgs */ 0);
1259f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  }
126087f22a2870ac363a5849a7252c1bd44ce2b809c2Jinsuk Kim
126187f22a2870ac363a5849a7252c1bd44ce2b809c2Jinsuk Kim  /// \brief Build a new initializer list expression.
1262f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  ///
1263f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1264f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1265f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
12667c5d31ea93d6f6770c34f7a2a364522d8cc4b5d8Yuncheol Heo                                   MultiExprArg Inits,
1267f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim                                   SourceLocation RBraceLoc,
126887f22a2870ac363a5849a7252c1bd44ce2b809c2Jinsuk Kim                                   QualType ResultTy) {
12698960d1b1552729e3dfd33deee951ac75933ad8e5Jinsuk Kim    OwningExprResult Result
1270a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1271a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    if (Result.isInvalid() || ResultTy->isDependentType())
1272a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim      return move(Result);
1273a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim
1274a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    // Patch in the result type we were given, which may have been computed
1275a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    // when the initial InitListExpr was built.
1276a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1277a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    ILE->setType(ResultTy);
1278a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    return move(Result);
1279a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  }
128072b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim
128172b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim  /// \brief Build a new designated initializer expression.
128272b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim  ///
128372b7d738d5b9254594726304cdb1777b54d95631Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1284a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1285a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1286f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                             MultiExprArg ArrayExprs,
1287f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                             SourceLocation EqualOrColonLoc,
1288f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                             bool GNUSyntax,
1289f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim                                             ExprArg Init) {
1290f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    OwningExprResult Result
1291a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1292c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                                           move(Init));
1293a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    if (Result.isInvalid())
1294a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim      return SemaRef.ExprError();
12958333571bd5e0a08773a1679964f8d96227af3356Jinsuk Kim
1296a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    ArrayExprs.release();
1297a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim    return move(Result);
1298a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  }
1299a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim
1300a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// \brief Build a new value-initialized expression.
1301c068bb5a0468bf605b0398e6f0ea5721917de4eeJinsuk Kim  ///
1302a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// By default, builds the implicit value initialization without performing
1303a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// any semantic analysis. Subclasses may override this routine to provide
1304a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// different behavior.
1305a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
13063b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1307f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  }
1308f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim
1309f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim  /// \brief Build a new \c va_arg expression.
13104612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang  ///
13114612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang  /// By default, performs semantic analysis to build the new expression.
13124612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang  /// Subclasses may override this routine to provide different behavior.
13134612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
13144612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang                                    QualType T, SourceLocation RParenLoc) {
13154612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
13164612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang                                RParenLoc);
13174612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jang  }
1318a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim
1319a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// \brief Build a new expression list in parentheses.
1320a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  ///
1321a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1322a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1323a062a9339add79a84862a34e363e3e454a6ec435Jinsuk Kim  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
13247fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                        MultiExprArg SubExprs,
132578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                        SourceLocation RParenLoc) {
13267fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
13277fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                               move(SubExprs));
13287fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  }
13297fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim
13307fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  /// \brief Build a new address-of-label expression.
13317fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  ///
133278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, performs semantic analysis, using the name of the label
133378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// rather than attempting to map the label statement itself.
133478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
13357fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
133678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                        SourceLocation LabelLoc,
13377fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                        LabelStmt *Label) {
13387fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
13397fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  }
13407fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim
13417fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  /// \brief Build a new GNU statement expression.
13427fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  ///
134378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
134478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
134578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
13467fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                   StmtArg SubStmt,
134778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                   SourceLocation RParenLoc) {
1348f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
134978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  }
135078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
135178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// \brief Build a new __builtin_types_compatible_p expression.
13527fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  ///
135378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1354f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// Subclasses may override this routine to provide different behavior.
135578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
13566d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                              QualType T1, QualType T2,
13576d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                              SourceLocation RParenLoc) {
13586d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
13596d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                              T1.getAsOpaquePtr(),
1360f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                              T2.getAsOpaquePtr(),
13616d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                              RParenLoc);
13626d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  }
13636d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim
13646d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// \brief Build a new __builtin_choose_expr expression.
13656d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  ///
13662738e2d872a22fe95a99941139863ff642fbd8e7Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
13676d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1368ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1369ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1370ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     SourceLocation RParenLoc) {
1371ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1372ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                   move(Cond), move(LHS), move(RHS),
1373ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                   RParenLoc);
1374ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  }
1375ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1376e9cf1583c74fd03977c1ecb14520663710f14439Jungshik Jang  /// \brief Build a new overloaded operator call expression.
1377ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  ///
1378ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
1379ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// The semantic analysis provides the behavior of template instantiation,
1380ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// copying with transformations that turn what looks like an overloaded
1381ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// operator call into a use of a builtin operator, performing
1382ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// argument-dependent lookup, etc. Subclasses may override this routine to
1383ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// provide different behavior.
1384ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1385ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                              SourceLocation OpLoc,
1386377dcbd53af4529c352d453424539b069909fce4Jungshik Jang                                              ExprArg Callee,
1387ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                              ExprArg First,
1388ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                              ExprArg Second);
1389ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1390ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1391ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// reinterpret_cast.
1392ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  ///
1393ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// By default, this routine dispatches to one of the more-specific routines
1394ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1395ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
1396ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1397ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                           Stmt::StmtClass Class,
1398c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                                           SourceLocation LAngleLoc,
1399ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                           TypeSourceInfo *TInfo,
1400ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                           SourceLocation RAngleLoc,
1401ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                           SourceLocation LParenLoc,
1402ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                           ExprArg SubExpr,
1403ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                           SourceLocation RParenLoc) {
1404ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    switch (Class) {
1405ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    case Stmt::CXXStaticCastExprClass:
1406ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
1407ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                   RAngleLoc, LParenLoc,
1408ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                   move(SubExpr), RParenLoc);
1409ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1410ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    case Stmt::CXXDynamicCastExprClass:
1411ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
1412ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                    RAngleLoc, LParenLoc,
1413ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                    move(SubExpr), RParenLoc);
1414ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1415ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    case Stmt::CXXReinterpretCastExprClass:
1416ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
1417ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                        RAngleLoc, LParenLoc,
1418ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                        move(SubExpr),
141992b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim                                                        RParenLoc);
142092b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim
14219c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    case Stmt::CXXConstCastExprClass:
14229c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14239c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                                   RAngleLoc, LParenLoc,
14249c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                                   move(SubExpr), RParenLoc);
14259c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim
14269c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    default:
142761f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang      assert(false && "Invalid C++ named cast");
14289c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim      break;
14299c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    }
14309c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim
14319c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    return getSema().ExprError();
1432ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  }
1433ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim
1434ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// \brief Build a new C++ static_cast expression.
1435ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  ///
1436ed0864557b3340ab7db00e2dc95b29c4b8bb485dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
14379c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
14389c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
14399c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                            SourceLocation LAngleLoc,
1440bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                            TypeSourceInfo *TInfo,
1441bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                            SourceLocation RAngleLoc,
1442bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                            SourceLocation LParenLoc,
1443bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                            ExprArg SubExpr,
1444bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                            SourceLocation RParenLoc) {
1445bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1446bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                       TInfo, move(SubExpr),
1447bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                       SourceRange(LAngleLoc, RAngleLoc),
1448bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim                                       SourceRange(LParenLoc, RParenLoc));
1449bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim  }
1450bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim
1451bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim  /// \brief Build a new C++ dynamic_cast expression.
1452bdf27fbf746bee11430c4db2ea6dfd026bae77feJinsuk Kim  ///
14539c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
145441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
145541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
145641d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                             SourceLocation LAngleLoc,
145741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                             TypeSourceInfo *TInfo,
145841d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                             SourceLocation RAngleLoc,
145941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                             SourceLocation LParenLoc,
146041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                             ExprArg SubExpr,
146141d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                             SourceLocation RParenLoc) {
146241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
146341d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                       TInfo, move(SubExpr),
146441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                       SourceRange(LAngleLoc, RAngleLoc),
146541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                       SourceRange(LParenLoc, RParenLoc));
146641d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  }
146741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang
146841d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  /// \brief Build a new C++ reinterpret_cast expression.
146941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  ///
147041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
147141d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
147241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
147341d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                                 SourceLocation LAngleLoc,
147441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                                 TypeSourceInfo *TInfo,
147541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                                 SourceLocation RAngleLoc,
147641d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                                 SourceLocation LParenLoc,
147741d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                                 ExprArg SubExpr,
147841d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                                 SourceLocation RParenLoc) {
147941d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
148041d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                       TInfo, move(SubExpr),
148141d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                       SourceRange(LAngleLoc, RAngleLoc),
148241d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang                                       SourceRange(LParenLoc, RParenLoc));
148341d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  }
148441d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang
148541d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  /// \brief Build a new C++ const_cast expression.
148641d974631c5f525da49c88d34cecedd5a4cfeda8Jungshik Jang  ///
1487a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
1488a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
1489a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1490a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                           SourceLocation LAngleLoc,
1491a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                           TypeSourceInfo *TInfo,
1492a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                           SourceLocation RAngleLoc,
1493a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                           SourceLocation LParenLoc,
149438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                           ExprArg SubExpr,
1495a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                           SourceLocation RParenLoc) {
1496a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1497a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                       TInfo, move(SubExpr),
1498a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                       SourceRange(LAngleLoc, RAngleLoc),
1499a13da0d5913757e2456020c69481f98d0e44c090Jungshik Jang                                       SourceRange(LParenLoc, RParenLoc));
1500160a6e5b99de15ce755e2e5521dce32d81ab180aJinsuk Kim  }
1501160a6e5b99de15ce755e2e5521dce32d81ab180aJinsuk Kim
15024d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// \brief Build a new C++ functional-style cast expression.
15034d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  ///
15044d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
15054d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
15064d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
15074d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim                                                TypeSourceInfo *TInfo,
15084d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim                                                SourceLocation LParenLoc,
1509119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                                ExprArg SubExpr,
1510119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                                SourceLocation RParenLoc) {
1511119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    void *Sub = SubExpr.takeAs<Expr>();
1512119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1513119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                               TInfo->getType().getAsOpaquePtr(),
1514f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                               LParenLoc,
1515119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                         Sema::MultiExprArg(getSema(), &Sub, 1),
1516119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                               /*CommaLocs=*/0,
1517119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                               RParenLoc);
1518119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  }
1519119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
1520119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// \brief Build a new C++ typeid(type) expression.
1521119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  ///
1522119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1523119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1524119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
1525119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                        SourceLocation TypeidLoc,
1526119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                        TypeSourceInfo *Operand,
1527119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                        SourceLocation RParenLoc) {
1528119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
1529119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                    RParenLoc);
1530119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  }
1531119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
1532119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// \brief Build a new C++ typeid(expr) expression.
1533119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  ///
1534119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1535119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1536119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
1537119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                        SourceLocation TypeidLoc,
1538119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                        ExprArg Operand,
153912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                        SourceLocation RParenLoc) {
1540a6b2a7a59ab79b2d91412c1095d1c49b8dc9d507Jungshik Jang    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, move(Operand),
1541a6b2a7a59ab79b2d91412c1095d1c49b8dc9d507Jungshik Jang                                    RParenLoc);
1542d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  }
1543d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim
1544d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  /// \brief Build a new C++ "this" expression.
1545d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  ///
1546d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  /// By default, builds a new "this" expression without performing any
154761c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim  /// semantic analysis. Subclasses may override this routine to provide
154861c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim  /// different behavior.
154961c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
155061c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim                                      QualType ThisType,
155161c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim                                      bool isImplicit) {
1552d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim    return getSema().Owned(
1553d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1554d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim                                                          isImplicit));
1555d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  }
1556d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim
1557d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  /// \brief Build a new C++ throw expression.
1558d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  ///
1559d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1560d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
1561d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1562d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
156312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  }
1564b22d9ee0a364b10d488dd6a2e8ba69d5ca7f6258Jinsuk Kim
156512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// \brief Build a new C++ default-argument expression.
1566b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  ///
1567b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// By default, builds a new default-argument expression, which does not
1568b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// require any semantic analysis. Subclasses may override this routine to
1569b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// provide different behavior.
1570b22d9ee0a364b10d488dd6a2e8ba69d5ca7f6258Jinsuk Kim  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1571b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                            ParmVarDecl *Param) {
1572b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1573b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                                     Param));
1574de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  }
1575de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim
1576b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// \brief Build a new C++ zero-initialization expression.
1577b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  ///
1578b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// By default, performs semantic analysis to build the new expression.
1579b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// Subclasses may override this routine to provide different behavior.
1580b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  OwningExprResult RebuildCXXScalarValueInitExpr(SourceLocation TypeStartLoc,
1581b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                               SourceLocation LParenLoc,
1582b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                               QualType T,
1583b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                               SourceLocation RParenLoc) {
1584b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1585b22d9ee0a364b10d488dd6a2e8ba69d5ca7f6258Jinsuk Kim                                               T.getAsOpaquePtr(), LParenLoc,
1586b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                               MultiExprArg(getSema(), 0, 0),
1587b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                               0, RParenLoc);
1588b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  }
1589de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim
1590de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  /// \brief Build a new C++ "new" expression.
1591b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  ///
1592b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// By default, performs semantic analysis to build the new expression.
1593b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// Subclasses may override this routine to provide different behavior.
1594b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1595b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                     bool UseGlobal,
1596a6b2a7a59ab79b2d91412c1095d1c49b8dc9d507Jungshik Jang                                     SourceLocation PlacementLParen,
1597a6b2a7a59ab79b2d91412c1095d1c49b8dc9d507Jungshik Jang                                     MultiExprArg PlacementArgs,
1598a6b2a7a59ab79b2d91412c1095d1c49b8dc9d507Jungshik Jang                                     SourceLocation PlacementRParen,
1599b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                     bool ParenTypeId,
1600b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                     QualType AllocType,
1601b22d9ee0a364b10d488dd6a2e8ba69d5ca7f6258Jinsuk Kim                                     SourceLocation TypeLoc,
1602b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                     SourceRange TypeRange,
1603b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                     ExprArg ArraySize,
1604b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                     SourceLocation ConstructorLParen,
1605de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim                                     MultiExprArg ConstructorArgs,
1606de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim                                     SourceLocation ConstructorRParen) {
1607b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1608b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 PlacementLParen,
1609b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 move(PlacementArgs),
1610b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 PlacementRParen,
1611b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 ParenTypeId,
1612bffb0635aaaaf9140d9120e3f3d95a4f7391a0acJungshik Jang                                 AllocType,
1613bffb0635aaaaf9140d9120e3f3d95a4f7391a0acJungshik Jang                                 TypeLoc,
1614bffb0635aaaaf9140d9120e3f3d95a4f7391a0acJungshik Jang                                 TypeRange,
1615b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 move(ArraySize),
1616b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 ConstructorLParen,
1617b22d9ee0a364b10d488dd6a2e8ba69d5ca7f6258Jinsuk Kim                                 move(ConstructorArgs),
1618b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                 ConstructorRParen);
1619b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  }
1620b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang
1621de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  /// \brief Build a new C++ "delete" expression.
1622de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  ///
1623b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// By default, performs semantic analysis to build the new expression.
1624b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// Subclasses may override this routine to provide different behavior.
1625b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1626b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                        bool IsGlobalDelete,
1627b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                        bool IsArrayForm,
1628a6b2a7a59ab79b2d91412c1095d1c49b8dc9d507Jungshik Jang                                        ExprArg Operand) {
1629f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1630f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                    move(Operand));
1631b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  }
1632f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
1633f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// \brief Build a new unary type trait expression.
1634f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  ///
1635f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// By default, performs semantic analysis to build the new expression.
1636f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// Subclasses may override this routine to provide different behavior.
1637f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1638f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                         SourceLocation StartLoc,
1639f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                         SourceLocation LParenLoc,
1640f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                         QualType T,
16413b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim                                         SourceLocation RParenLoc) {
1642f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1643f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                         T.getAsOpaquePtr(), RParenLoc);
1644f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  }
1645f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
1646b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  /// \brief Build a new (previously unresolved) declaration reference
1647f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// expression.
1648f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  ///
1649f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// By default, performs semantic analysis to build the new expression.
1650f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// Subclasses may override this routine to provide different behavior.
1651f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1652b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim                                                SourceRange QualifierRange,
1653b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim                                                DeclarationName Name,
1654f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                                SourceLocation Location,
1655b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim                              const TemplateArgumentListInfo *TemplateArgs) {
1656f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    CXXScopeSpec SS;
1657959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo    SS.setRange(QualifierRange);
1658959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo    SS.setScopeRep(NNS);
1659959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo
1660959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo    if (TemplateArgs)
1661959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1662959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo                                                    *TemplateArgs);
1663959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo
1664959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1665959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  }
1666959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo
1667959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  /// \brief Build a new template-id expression.
1668959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  ///
1669959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  /// By default, performs semantic analysis to build the new expression.
1670959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  /// Subclasses may override this routine to provide different behavior.
167161c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
167261c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim                                         LookupResult &R,
167361c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim                                         bool RequiresADL,
167461c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim                              const TemplateArgumentListInfo &TemplateArgs) {
167561c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
167661c94d1a03971b07c4ac28af678f3fff6b695c32Jinsuk Kim  }
1677959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo
1678959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  /// \brief Build a new object-construction expression.
1679959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  ///
1680959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  /// By default, performs semantic analysis to build the new expression.
1681959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  /// Subclasses may override this routine to provide different behavior.
1682959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo  OwningExprResult RebuildCXXConstructExpr(QualType T,
1683959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo                                           SourceLocation Loc,
1684959d2db12c7c6a06465af1251bc4cece580a72a3Terry Heo                                           CXXConstructorDecl *Constructor,
168578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                           bool IsElidable,
168678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                           MultiExprArg Args) {
1687a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
168879c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
168979c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                          ConvertedArgs))
169079c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang      return getSema().ExprError();
16917fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim
16927fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
1693c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                                           move_arg(ConvertedArgs));
16947fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim  }
16957fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim
169679c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang  /// \brief Build a new object-construction expression.
169778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  ///
169878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1699a5b7414970c85217e88015e78ecbc5ba093dead3Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
170079c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
170179c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                                 QualType T,
170279c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                                 SourceLocation LParenLoc,
17037fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                                 MultiExprArg Args,
17047fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                                 SourceLocation *Commas,
1705c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                                                 SourceLocation RParenLoc) {
17067fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
17077fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                               T.getAsOpaquePtr(),
170879c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                                               LParenLoc,
170978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                               move(Args),
171078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                               Commas,
17113cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                               RParenLoc);
17123cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  }
171378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
171478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// \brief Build a new object-construction expression.
171578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  ///
171678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
171778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
171878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
171978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                     QualType T,
172078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                     SourceLocation LParenLoc,
172178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                     MultiExprArg Args,
17223cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                                     SourceLocation *Commas,
17233cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                                     SourceLocation RParenLoc) {
17243cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
17253cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                                           /*FIXME*/LParenLoc),
17263cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                               T.getAsOpaquePtr(),
17273cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                               LParenLoc,
17283cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                               move(Args),
17293cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                               Commas,
17303cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                               RParenLoc);
17313cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  }
17323cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim
17333cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  /// \brief Build a new member reference expression.
17343cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  ///
17353cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  /// By default, performs semantic analysis to build the new expression.
17363cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  /// Subclasses may override this routine to provide different behavior.
17373cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
17383cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                                  QualType BaseType,
17393cd30516ad16150dee55ad8f704a0c3bf20b58b2Jinsuk Kim                                                  bool IsArrow,
174078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                  SourceLocation OperatorLoc,
174178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                              NestedNameSpecifier *Qualifier,
174278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                  SourceRange QualifierRange,
174378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                            NamedDecl *FirstQualifierInScope,
174478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                  DeclarationName Name,
174578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                                  SourceLocation MemberLoc,
174678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                              const TemplateArgumentListInfo *TemplateArgs) {
174778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    CXXScopeSpec SS;
174878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    SS.setRange(QualifierRange);
174978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    SS.setScopeRep(Qualifier);
175078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
175178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
175278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                                            OperatorLoc, IsArrow,
17537fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                            SS, FirstQualifierInScope,
17546d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                            Name, MemberLoc, TemplateArgs);
17554893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  }
17564893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim
17574893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  /// \brief Build a new member reference expression.
17584893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  ///
17594893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
17604893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
17614893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
17626d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                               QualType BaseType,
17634893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                               SourceLocation OperatorLoc,
17644893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                               bool IsArrow,
17654893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                               NestedNameSpecifier *Qualifier,
17664893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                               SourceRange QualifierRange,
176761daf6b38e7a7ada2a6ca5a60539a54b9c6810bdJungshik Jang                                               NamedDecl *FirstQualifierInScope,
17684893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                               LookupResult &R,
1769f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                const TemplateArgumentListInfo *TemplateArgs) {
17704893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim    CXXScopeSpec SS;
1771f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    SS.setRange(QualifierRange);
17724893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim    SS.setScopeRep(Qualifier);
17734893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim
17746d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
17756d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                            OperatorLoc, IsArrow,
17766d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                            SS, FirstQualifierInScope,
17776d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim                                            R, TemplateArgs);
17786d97f5b91c6c82f28a2a3a5d3b922f0e5844e733Jinsuk Kim  }
1779ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1780ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// \brief Build a new Objective-C @encode expression.
1781ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  ///
1782ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
1783ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
1784ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1785ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                         TypeSourceInfo *EncodeTypeInfo,
1786ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                         SourceLocation RParenLoc) {
1787ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1788ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                                           RParenLoc));
1789ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  }
1790ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1791ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// \brief Build a new Objective-C class message.
1792ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
1793ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                          Selector Sel,
1794ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                          ObjCMethodDecl *Method,
1795ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                          SourceLocation LBracLoc,
1796ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                          MultiExprArg Args,
1797ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                          SourceLocation RBracLoc) {
1798ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
1799ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     ReceiverTypeInfo->getType(),
1800ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     /*SuperLoc=*/SourceLocation(),
1801ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     Sel, Method, LBracLoc, RBracLoc,
1802ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                     move(Args));
1803ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  }
1804ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1805ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang  /// \brief Build a new Objective-C instance message.
18069c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  OwningExprResult RebuildObjCMessageExpr(ExprArg Receiver,
1807f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                          Selector Sel,
1808f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                          ObjCMethodDecl *Method,
1809f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                          SourceLocation LBracLoc,
1810f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                          MultiExprArg Args,
1811f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                          SourceLocation RBracLoc) {
1812f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    QualType ReceiverType = static_cast<Expr *>(Receiver.get())->getType();
18139c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    return SemaRef.BuildInstanceMessage(move(Receiver),
18149c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                        ReceiverType,
18159c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                        /*SuperLoc=*/SourceLocation(),
1816f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                        Sel, Method, LBracLoc, RBracLoc,
18179c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                        move(Args));
18189c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  }
18199c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim
18209c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  /// \brief Build a new Objective-C ivar reference expression.
18219c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  ///
18229c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  /// By default, performs semantic analysis to build the new expression.
1823f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  /// Subclasses may override this routine to provide different behavior.
18249c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim  OwningExprResult RebuildObjCIvarRefExpr(ExprArg BaseArg, ObjCIvarDecl *Ivar,
18259c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                          SourceLocation IvarLoc,
18269c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                          bool IsArrow, bool IsFreeIvar) {
18279c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    // FIXME: We lose track of the IsFreeIvar bit.
18289c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    CXXScopeSpec SS;
18299c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    Expr *Base = BaseArg.takeAs<Expr>();
18309c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
18319c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                   Sema::LookupMemberName);
18329c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
183361f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang                                                         /*FIME:*/IvarLoc,
18349c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                                         SS, DeclPtrTy(),
1835f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                                         false);
18369c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    if (Result.isInvalid())
1837f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang      return getSema().ExprError();
18389c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim
18399c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    if (Result.get())
18409c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim      return move(Result);
18419c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim
18429c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
18439c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                              Base->getType(),
18449c37e1f53ea4734bfe5ae156dc5399ce5f2c7cccJinsuk Kim                                              /*FIXME:*/IvarLoc, IsArrow, SS,
184512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                              /*FirstQualifierInScope=*/0,
1846b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                              R,
1847f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                              /*TemplateArgs=*/0);
1848b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  }
184912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
1850b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// \brief Build a new Objective-C property reference expression.
185112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  ///
1852b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// By default, performs semantic analysis to build the new expression.
1853b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  /// Subclasses may override this routine to provide different behavior.
1854b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang  OwningExprResult RebuildObjCPropertyRefExpr(ExprArg BaseArg,
1855b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                              ObjCPropertyDecl *Property,
1856b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                              SourceLocation PropertyLoc) {
1857b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    CXXScopeSpec SS;
1858f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    Expr *Base = BaseArg.takeAs<Expr>();
185912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1860f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                   Sema::LookupMemberName);
186112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    bool IsArrow = false;
186212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1863b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                                         /*FIME:*/PropertyLoc,
1864b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                                         SS, DeclPtrTy(),
1865b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang                                                         false);
1866b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    if (Result.isInvalid())
1867b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang      return getSema().ExprError();
1868b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang
1869326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang    if (Result.get())
187012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang      return move(Result);
1871f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
187212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1873326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang                                              Base->getType(),
187412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                              /*FIXME:*/PropertyLoc, IsArrow,
187512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                              SS,
187612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                              /*FirstQualifierInScope=*/0,
187712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                              R,
187812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang                                              /*TemplateArgs=*/0);
187912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  }
188012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
1881326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang  /// \brief Build a new Objective-C implicit setter/getter reference
188212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// expression.
1883f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  ///
188412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
1885326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang  /// Subclasses may override this routine to provide different behavior.
188612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  OwningExprResult RebuildObjCImplicitSetterGetterRefExpr(
1887e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang                                                        ObjCMethodDecl *Getter,
1888e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang                                                          QualType T,
1889e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang                                                        ObjCMethodDecl *Setter,
1890e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang                                                        SourceLocation NameLoc,
1891e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang                                                          ExprArg Base) {
1892e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang    // Since these expressions can only be value-dependent, we do not need to
1893326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang    // perform semantic analysis again.
1894e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang    return getSema().Owned(
1895f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
1896e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang                                                                     Setter,
1897326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang                                                                     NameLoc,
1898326aef0c9402742e29c4503c857f93e75cf9a6ecJungshik Jang                                                          Base.takeAs<Expr>()));
1899e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang  }
1900e5a9337ebe738633cf7b66141cdf76efcdc5754cJungshik Jang
190112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// \brief Build a new Objective-C "isa" expression.
190212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  ///
190312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// By default, performs semantic analysis to build the new expression.
190412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  /// Subclasses may override this routine to provide different behavior.
190512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang  OwningExprResult RebuildObjCIsaExpr(ExprArg BaseArg, SourceLocation IsaLoc,
19067fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                      bool IsArrow) {
19077fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    CXXScopeSpec SS;
19087fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    Expr *Base = BaseArg.takeAs<Expr>();
19097fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
19107fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                   Sema::LookupMemberName);
19117fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
19127fe2ae0fe9c24f0a1a5ddf20850069b56af2c2fdJinsuk Kim                                                         /*FIME:*/IsaLoc,
191363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                                                         SS, DeclPtrTy(),
1914f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                                         false);
1915ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    if (Result.isInvalid())
1916ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      return getSema().ExprError();
1917ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1918ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    if (Result.get())
1919ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang      return move(Result);
1920ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang
1921ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1922ea67c183fe5511ad99aeaae1a32b5245bd020e36Jungshik Jang                                              Base->getType(),
19234893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                              /*FIXME:*/IsaLoc, IsArrow, SS,
19244893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim                                              /*FirstQualifierInScope=*/0,
192560cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                              R,
1926f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                              /*TemplateArgs=*/0);
1927f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  }
192860cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang
192960cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// \brief Build a new shuffle vector expression.
193060cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  ///
193160cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  /// By default, performs semantic analysis to build the new expression.
19324893c7efde52411ad051ef5c20251439f4098eacJinsuk Kim  /// Subclasses may override this routine to provide different behavior.
193360cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
193460cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                            MultiExprArg SubExprs,
193560cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                            SourceLocation RParenLoc) {
193660cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang    // Find the declaration for __builtin_shufflevector
193760cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang    const IdentifierInfo &Name
193860cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1939e81e108c4035ea8933525baa8108cb392f8abf5dJungshik Jang    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1940e81e108c4035ea8933525baa8108cb392f8abf5dJungshik Jang    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1941f98b9e87f9258d4ffb53859de2a138e72174cc23Jinsuk Kim    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
194261f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang
194379c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang    // Build a reference to the __builtin_shufflevector builtin
194479c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1945e946ed8f54c5ee0e58e168df00d4f418e1eed7a7Yuncheol Heo    Expr *Callee
1946b8d62e70bf2612e9c75bf7d8b2370f80e5877f95Yuncheol Heo      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1947e946ed8f54c5ee0e58e168df00d4f418e1eed7a7Yuncheol Heo                                          BuiltinLoc);
1948e946ed8f54c5ee0e58e168df00d4f418e1eed7a7Yuncheol Heo    SemaRef.UsualUnaryConversions(Callee);
1949de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim
1950de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim    // Build the CallExpr
1951de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim    unsigned NumSubExprs = SubExprs.size();
1952de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim    Expr **Subs = (Expr **)SubExprs.release();
195379c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1954c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                                                       Subs, NumSubExprs,
195561f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang                                                       Builtin->getResultType(),
195660cffce420db4c3395f86d3b9bb36003adf26f5dJungshik Jang                                                       RParenLoc);
1957a858d221ff86c497e745222ea15bab141e337636Jungshik Jang    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1958a858d221ff86c497e745222ea15bab141e337636Jungshik Jang
1959a858d221ff86c497e745222ea15bab141e337636Jungshik Jang    // Type-check the __builtin_shufflevector expression.
1960a858d221ff86c497e745222ea15bab141e337636Jungshik Jang    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
196192b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim    if (Result.isInvalid())
196292b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim      return SemaRef.ExprError();
196392b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim
196492b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim    OwnedCall.release();
196592b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim    return move(Result);
196692b77cf9cbf512e7141cad6fef5a38d0682dde43Jinsuk Kim  }
196738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo};
1968f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang
196938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heotemplate<typename Derived>
1970f67113f7abd536cc3eb888344bf925762aa5278eJungshik JangSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
197138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  if (!S)
197238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    return SemaRef.Owned(S);
197338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
1974f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang  switch (S->getStmtClass()) {
197538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case Stmt::NoStmtClass: break;
1976f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang
1977c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  // Transform individual statement nodes
1978c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim#define STMT(Node, Parent)                                              \
197938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
198038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#define EXPR(Node, Parent)
1981f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang#include "clang/AST/StmtNodes.inc"
198238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
1983f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang  // Transform expressions by calling TransformExpr.
1984c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim#define STMT(Node, Parent)
1985c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim#define ABSTRACT_STMT(Stmt)
198638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#define EXPR(Node, Parent) case Stmt::Node##Class:
198738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#include "clang/AST/StmtNodes.inc"
1988f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang    {
198938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1990f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang      if (E.isInvalid())
1991c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return getSema().StmtError();
199238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
199338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
199438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    }
199538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  }
199638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
1997fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo  return SemaRef.Owned(S->Retain());
1998280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn}
199938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
200038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
200138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heotemplate<typename Derived>
200238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol HeoSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
200338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  if (!E)
200438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    return SemaRef.Owned(E);
200538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
200638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  switch (E->getStmtClass()) {
2007e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim    case Stmt::NoStmtClass: break;
200838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#define STMT(Node, Parent) case Stmt::Node##Class: break;
200938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#define ABSTRACT_STMT(Stmt)
201038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#define EXPR(Node, Parent)                                              \
201138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
201238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo#include "clang/AST/StmtNodes.inc"
201338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  }
201438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
2015c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  return SemaRef.Owned(E->Retain());
201638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo}
2017a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang
2018fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heotemplate<typename Derived>
2019fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol HeoNestedNameSpecifier *
2020fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol HeoTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2021fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo                                                     SourceRange Range,
2022fc44e4e03c5f6486efb7457965dcf7eaf36bc971Yuncheol Heo                                                     QualType ObjectType,
2023a9f10629f4bc1a82761917645ff4d2b6d42e47b3Jungshik Jang                                             NamedDecl *FirstQualifierInScope) {
202438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  if (!NNS)
202538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    return 0;
202638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
202738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  // Transform the prefix of this nested name specifier.
202838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  NestedNameSpecifier *Prefix = NNS->getPrefix();
202938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  if (Prefix) {
203038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2031e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim                                                       ObjectType,
203238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                                       FirstQualifierInScope);
2033e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim    if (!Prefix)
2034c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim      return 0;
20350608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
20360608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo    // Clear out the object type and the first qualifier in scope; they only
20374fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    // apply to the first element in the nested-name-specifier.
20384fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    ObjectType = QualType();
20394fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    FirstQualifierInScope = 0;
20404fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  }
20414fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
20424fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  switch (NNS->getKind()) {
20434fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  case NestedNameSpecifier::Identifier:
20444fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    assert((Prefix || !ObjectType.isNull()) &&
2045e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim            "Identifier nested-name-specifier with no prefix or object type");
20464b54271f1bbd29957c47433155c58aa792105d6dYuncheol Heo    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
20474b54271f1bbd29957c47433155c58aa792105d6dYuncheol Heo        ObjectType.isNull())
20484b54271f1bbd29957c47433155c58aa792105d6dYuncheol Heo      return NNS;
20494fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
20504fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
20514fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang                                                   *NNS->getAsIdentifier(),
20524fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang                                                   ObjectType,
20534fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang                                                   FirstQualifierInScope);
2054e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim
2055e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim  case NestedNameSpecifier::Namespace: {
2056e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim    NamespaceDecl *NS
2057e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim      = cast_or_null<NamespaceDecl>(
2058e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim                                    getDerived().TransformDecl(Range.getBegin(),
2059e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim                                                       NNS->getAsNamespace()));
2060e26d833c4a00bc7c1c23083f28ef891703e7e385Jinsuk Kim    if (!getDerived().AlwaysRebuild() &&
20611ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo        Prefix == NNS->getPrefix() &&
20621ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo        NS == NNS->getAsNamespace())
20631ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo      return NNS;
20641ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo
20651ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2066de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim  }
20671ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo
20685b8cb00b8a302329b98a5528eaa7934d0f5c3e65Jinsuk Kim  case NestedNameSpecifier::Global:
20691ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo    // There is no meaningful transformation that one could perform on the
20701ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo    // global scope.
20711ca0a43251a31bb1b4253dc404316cc4b840f497Terry Heo    return NNS;
2072f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang
2073f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang  case NestedNameSpecifier::TypeSpecWithTemplate:
2074f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang  case NestedNameSpecifier::TypeSpec: {
2075f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2076f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2077f67113f7abd536cc3eb888344bf925762aa5278eJungshik Jang                                            ObjectType);
20784fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    if (T.isNull())
2079350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jang      return 0;
2080350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jang
2081350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jang    if (!getDerived().AlwaysRebuild() &&
2082350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jang        Prefix == NNS->getPrefix() &&
208338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo        T == QualType(NNS->getAsType(), 0))
2084350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jang      return NNS;
2085f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim
208638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
208738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
208838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                                   T);
20894fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  }
20904fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  }
20914fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
20924fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  // Required to silence a GCC warning
20934fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  return 0;
20944fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang}
20954fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
20964fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jangtemplate<typename Derived>
20974fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik JangDeclarationName
20984fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik JangTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
2099e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim                                                 SourceLocation Loc,
210038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo                                                 QualType ObjectType) {
21014fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  if (!Name)
21024fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    return Name;
2103c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim
210438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  switch (Name.getNameKind()) {
210538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case DeclarationName::Identifier:
2106c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim  case DeclarationName::ObjCZeroArgSelector:
210738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case DeclarationName::ObjCOneArgSelector:
2108e6e8f3d589f42393cf02a2bd766d678d80dad874Jinsuk Kim  case DeclarationName::ObjCMultiArgSelector:
210938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case DeclarationName::CXXOperatorName:
211038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case DeclarationName::CXXLiteralOperatorName:
2111964c00dd7b270dcf80aea3450bbfc23502965cceJinsuk Kim  case DeclarationName::CXXUsingDirective:
21125008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    return Name;
21135b8cb00b8a302329b98a5528eaa7934d0f5c3e65Jinsuk Kim
211438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo  case DeclarationName::CXXConstructorName:
21154d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  case DeclarationName::CXXDestructorName:
2116119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  case DeclarationName::CXXConversionFunctionName: {
2117119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    TemporaryBase Rebase(*this, Loc, Name);
2118119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    QualType T = getDerived().TransformType(Name.getCXXNameType(),
2119119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                            ObjectType);
2120119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    if (T.isNull())
2121119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim      return DeclarationName();
2122119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
2123119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
2124119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                                           Name.getNameKind(),
2125119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                          SemaRef.Context.getCanonicalType(T));
2126119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  }
2127119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  }
2128119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
21290608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  return DeclarationName();
21300608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo}
2131119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
2132d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kimtemplate<typename Derived>
2133d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk KimTemplateName
2134d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk KimTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
2135119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                              QualType ObjectType) {
2136119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  SourceLocation Loc = getDerived().getBaseLocation();
2137119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
2138119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
2139119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    NestedNameSpecifier *NNS
21400608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2141119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2142119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim                                                  ObjectType);
2143119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    if (!NNS)
2144119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim      return TemplateName();
2145d4a94db1cd44a536d535de890a0a14919a39a0dcJinsuk Kim
2146119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
2147119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim      TemplateDecl *TransTemplate
2148119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
21490608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo      if (!TransTemplate)
21500608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo        return TemplateName();
21510608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
21520608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo      if (!getDerived().AlwaysRebuild() &&
21530608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo          NNS == QTN->getQualifier() &&
21540608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo          TransTemplate == Template)
21550608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo        return Name;
21560608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
21570608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
21580608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo                                              TransTemplate);
21590608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo    }
21600608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
21610608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo    // These should be getting filtered out before they make it into the AST.
21620608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo    assert(false && "overloaded template name survived to here");
21630608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo  }
21640608b9328b1c2f804ffb2d4165c34383d34bde2aYuncheol Heo
2165b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
2166b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim    NestedNameSpecifier *NNS
2167b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2168f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2169f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                                  ObjectType);
2170f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    if (!NNS && DTN->getQualifier())
2171f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang      return TemplateName();
2172f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
2173f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    if (!getDerived().AlwaysRebuild() &&
2174f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang        NNS == DTN->getQualifier() &&
2175f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang        ObjectType.isNull())
2176b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim      return Name;
2177f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
2178f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    if (DTN->isIdentifier())
2179f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2180b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim                                              ObjectType);
2181f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
2182b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2183f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang                                            ObjectType);
2184f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang  }
2185f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
2186b3fbf9dbe8d41d91efbac2118b676af74592257bJinsuk Kim  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
2187f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    TemplateDecl *TransTemplate
2188f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2189f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang    if (!TransTemplate)
2190f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang      return TemplateName();
2191f424932cfb1b16b01a37500d09e295912700a51dJungshik Jang
21924d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim    if (!getDerived().AlwaysRebuild() &&
21934d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim        TransTemplate == Template)
21944d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim      return Name;
21954d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim
21964d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim    return TemplateName(TransTemplate);
21974d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  }
21984d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim
21994d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  // These should be getting filtered out before they reach the AST.
22004d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  assert(false && "overloaded function decl survived to here");
22014d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim  return TemplateName();
22024d43d93743222311c6377d4904c19ccb93699d3bJinsuk Kim}
22034fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
22044fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jangtemplate<typename Derived>
2205350e68d0b80c22e6ec37dd683134f46079619803Jungshik Jangvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
22065008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                         const TemplateArgument &Arg,
22075008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim                                         TemplateArgumentLoc &Output) {
22085008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  SourceLocation Loc = getDerived().getBaseLocation();
22095008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  switch (Arg.getKind()) {
22105008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim  case TemplateArgument::Null:
22115008486b09c588bf3409b70d9ee29225e8593c64Jinsuk Kim    llvm_unreachable("null template argument in TreeTransform");
22124fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    break;
22134fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
22144fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang  case TemplateArgument::Type:
22154fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    Output = TemplateArgumentLoc(Arg,
22164fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
22174fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang
22184fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    break;
2219f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2220f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Template:
22214fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2222f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    break;
2223f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2224f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Expression:
2225f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2226f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    break;
2227f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2228f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Declaration:
2229f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Integral:
2230f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Pack:
2231f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2232f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    break;
2233f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  }
2234f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo}
2235f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2236f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heotemplate<typename Derived>
2237f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heobool TreeTransform<Derived>::TransformTemplateArgument(
2238f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo                                         const TemplateArgumentLoc &Input,
2239f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo                                         TemplateArgumentLoc &Output) {
2240f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  const TemplateArgument &Arg = Input.getArgument();
2241f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  switch (Arg.getKind()) {
2242f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Null:
2243f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Integral:
2244f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    Output = Input;
2245f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    return false;
2246f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2247f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Type: {
2248f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2249f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    if (DI == NULL)
2250f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2251f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2252f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    DI = getDerived().TransformType(DI);
2253f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    if (!DI) return true;
2254f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2255f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2256f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo    return false;
2257f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  }
2258f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo
2259f17024873b10dabed069e502030dd85d6257c0c4Yuncheol Heo  case TemplateArgument::Declaration: {
22604fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang    // FIXME: we should never have to transform one of these.
2261867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang    DeclarationName Name;
2262867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2263867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang      Name = ND->getDeclName();
2264867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang    TemporaryBase Rebase(*this, Input.getLocation(), Name);
2265867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2266e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    if (!D) return true;
2267e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
2268e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    Expr *SourceExpr = Input.getSourceDeclExpression();
2269e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    if (SourceExpr) {
2270e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      EnterExpressionEvaluationContext Unevaluated(getSema(),
2271e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim                                                   Action::Unevaluated);
2272e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
2273e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      if (E.isInvalid())
2274e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim        SourceExpr = NULL;
2275e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      else {
2276e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim        SourceExpr = E.takeAs<Expr>();
2277e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim        SourceExpr->Retain();
2278e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      }
2279e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    }
2280e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
2281e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2282e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    return false;
2283e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  }
2284e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
2285e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim  case TemplateArgument::Template: {
2286e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2287e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    TemplateName Template
2288e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2289e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    if (Template.isNull())
2290e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      return true;
2291e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
2292e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    Output = TemplateArgumentLoc(TemplateArgument(Template),
2293de7a4248d8631099544e4cf43c02b10131cf6672Jinsuk Kim                                 Input.getTemplateQualifierRange(),
2294e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim                                 Input.getTemplateNameLoc());
2295cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim    return false;
2296cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim  }
2297cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim
2298cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim  case TemplateArgument::Expression: {
2299cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim    // Template argument expressions are not potentially evaluated.
2300cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim    EnterExpressionEvaluationContext Unevaluated(getSema(),
2301cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim                                                 Action::Unevaluated);
2302cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim
2303cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim    Expr *InputExpr = Input.getSourceExpression();
2304cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2305cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim
2306e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    Sema::OwningExprResult E
2307e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim      = getDerived().TransformExpr(InputExpr);
2308e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    if (E.isInvalid()) return true;
2309e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim
2310e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    Expr *ETaken = E.takeAs<Expr>();
2311f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim    ETaken->Retain();
2312e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2313e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    return false;
23143b9309a01c9aa0544f97b2ec6abe7b254d829336Jinsuk Kim  }
2315cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim
2316cb8661c08f4a7b00eaa2ede06a30c32dd3cbc53bJinsuk Kim  case TemplateArgument::Pack: {
2317e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2318867b4e0c55b4b1e432a3585fc945a999f066ef81Jungshik Jang    TransformedArgs.reserve(Arg.pack_size());
231908a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2320e9f6ed3b11fb8ebae5e73db1e4736b86cae272d9Jinsuk Kim                                      AEnd = Arg.pack_end();
2321f286b4d86b4b2ac91edb88d0336810e46d9a16ceJinsuk Kim         A != AEnd; ++A) {
232208a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo
232308a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      // FIXME: preserve source information here when we start
232408a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      // caring about parameter packs.
232508a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo
232608a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      TemplateArgumentLoc InputArg;
232708a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      TemplateArgumentLoc OutputArg;
232808a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      getDerived().InventTemplateArgumentLoc(*A, InputArg);
232908a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
233008a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo        return true;
233108a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo
233208a1be81d7b597f858164fee6a4934264259b3aeYuncheol Heo      TransformedArgs.push_back(OutputArg.getArgument());
2333339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang    }
2334339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang    TemplateArgument Result;
2335339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2336339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                           true);
2337339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2338339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang    return false;
2339339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang  }
2340339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang  }
2341339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang
23422e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang  // Work around bogus GCC warning
23432e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang  return true;
23442e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang}
23452e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang
23462e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang//===----------------------------------------------------------------------===//
23472e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang// Type transformation
23482b0da5c4c84305f1d391dc78b85e244c9fd92456Yuncheol Heo//===----------------------------------------------------------------------===//
23492e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang
23502e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jangtemplate<typename Derived>
23512e8f1b6399089626b4f0249427626ba6e63a62efJungshik JangQualType TreeTransform<Derived>::TransformType(QualType T,
23520792d37385e60aa8d73f8df174d0a32f4f618bc4Jungshik Jang                                               QualType ObjectType) {
2353  if (getDerived().AlreadyTransformed(T))
2354    return T;
2355
2356  // Temporary workaround.  All of these transformations should
2357  // eventually turn into transformations on TypeLocs.
2358  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
2359  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2360
2361  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
2362
2363  if (!NewDI)
2364    return QualType();
2365
2366  return NewDI->getType();
2367}
2368
2369template<typename Derived>
2370TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2371                                                      QualType ObjectType) {
2372  if (getDerived().AlreadyTransformed(DI->getType()))
2373    return DI;
2374
2375  TypeLocBuilder TLB;
2376
2377  TypeLoc TL = DI->getTypeLoc();
2378  TLB.reserve(TL.getFullDataSize());
2379
2380  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2381  if (Result.isNull())
2382    return 0;
2383
2384  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2385}
2386
2387template<typename Derived>
2388QualType
2389TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2390                                      QualType ObjectType) {
2391  switch (T.getTypeLocClass()) {
2392#define ABSTRACT_TYPELOC(CLASS, PARENT)
2393#define TYPELOC(CLASS, PARENT) \
2394  case TypeLoc::CLASS: \
2395    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2396                                               ObjectType);
2397#include "clang/AST/TypeLocNodes.def"
2398  }
2399
2400  llvm_unreachable("unhandled type loc!");
2401  return QualType();
2402}
2403
2404/// FIXME: By default, this routine adds type qualifiers only to types
2405/// that can have qualifiers, and silently suppresses those qualifiers
2406/// that are not permitted (e.g., qualifiers on reference or function
2407/// types). This is the right thing for template instantiation, but
2408/// probably not for other clients.
2409template<typename Derived>
2410QualType
2411TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2412                                               QualifiedTypeLoc T,
2413                                               QualType ObjectType) {
2414  Qualifiers Quals = T.getType().getLocalQualifiers();
2415
2416  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2417                                               ObjectType);
2418  if (Result.isNull())
2419    return QualType();
2420
2421  // Silently suppress qualifiers if the result type can't be qualified.
2422  // FIXME: this is the right thing for template instantiation, but
2423  // probably not for other clients.
2424  if (Result->isFunctionType() || Result->isReferenceType())
2425    return Result;
2426
2427  if (!Quals.empty()) {
2428    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
2429    TLB.push<QualifiedTypeLoc>(Result);
2430    // No location information to preserve.
2431  }
2432
2433  return Result;
2434}
2435
2436template <class TyLoc> static inline
2437QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2438  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2439  NewT.setNameLoc(T.getNameLoc());
2440  return T.getType();
2441}
2442
2443template<typename Derived>
2444QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2445                                                      BuiltinTypeLoc T,
2446                                                      QualType ObjectType) {
2447  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2448  NewT.setBuiltinLoc(T.getBuiltinLoc());
2449  if (T.needsExtraLocalData())
2450    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2451  return T.getType();
2452}
2453
2454template<typename Derived>
2455QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2456                                                      ComplexTypeLoc T,
2457                                                      QualType ObjectType) {
2458  // FIXME: recurse?
2459  return TransformTypeSpecType(TLB, T);
2460}
2461
2462template<typename Derived>
2463QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2464                                                      PointerTypeLoc TL,
2465                                                      QualType ObjectType) {
2466  QualType PointeeType
2467    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2468  if (PointeeType.isNull())
2469    return QualType();
2470
2471  QualType Result = TL.getType();
2472  if (PointeeType->getAs<ObjCObjectType>()) {
2473    // A dependent pointer type 'T *' has is being transformed such
2474    // that an Objective-C class type is being replaced for 'T'. The
2475    // resulting pointer type is an ObjCObjectPointerType, not a
2476    // PointerType.
2477    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
2478
2479    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2480    NewT.setStarLoc(TL.getStarLoc());
2481    return Result;
2482  }
2483
2484  if (getDerived().AlwaysRebuild() ||
2485      PointeeType != TL.getPointeeLoc().getType()) {
2486    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
2487    if (Result.isNull())
2488      return QualType();
2489  }
2490
2491  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
2492  NewT.setSigilLoc(TL.getSigilLoc());
2493  return Result;
2494}
2495
2496template<typename Derived>
2497QualType
2498TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2499                                                  BlockPointerTypeLoc TL,
2500                                                  QualType ObjectType) {
2501  QualType PointeeType
2502    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2503  if (PointeeType.isNull())
2504    return QualType();
2505
2506  QualType Result = TL.getType();
2507  if (getDerived().AlwaysRebuild() ||
2508      PointeeType != TL.getPointeeLoc().getType()) {
2509    Result = getDerived().RebuildBlockPointerType(PointeeType,
2510                                                  TL.getSigilLoc());
2511    if (Result.isNull())
2512      return QualType();
2513  }
2514
2515  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2516  NewT.setSigilLoc(TL.getSigilLoc());
2517  return Result;
2518}
2519
2520/// Transforms a reference type.  Note that somewhat paradoxically we
2521/// don't care whether the type itself is an l-value type or an r-value
2522/// type;  we only care if the type was *written* as an l-value type
2523/// or an r-value type.
2524template<typename Derived>
2525QualType
2526TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2527                                               ReferenceTypeLoc TL,
2528                                               QualType ObjectType) {
2529  const ReferenceType *T = TL.getTypePtr();
2530
2531  // Note that this works with the pointee-as-written.
2532  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2533  if (PointeeType.isNull())
2534    return QualType();
2535
2536  QualType Result = TL.getType();
2537  if (getDerived().AlwaysRebuild() ||
2538      PointeeType != T->getPointeeTypeAsWritten()) {
2539    Result = getDerived().RebuildReferenceType(PointeeType,
2540                                               T->isSpelledAsLValue(),
2541                                               TL.getSigilLoc());
2542    if (Result.isNull())
2543      return QualType();
2544  }
2545
2546  // r-value references can be rebuilt as l-value references.
2547  ReferenceTypeLoc NewTL;
2548  if (isa<LValueReferenceType>(Result))
2549    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
2550  else
2551    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
2552  NewTL.setSigilLoc(TL.getSigilLoc());
2553
2554  return Result;
2555}
2556
2557template<typename Derived>
2558QualType
2559TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2560                                                 LValueReferenceTypeLoc TL,
2561                                                     QualType ObjectType) {
2562  return TransformReferenceType(TLB, TL, ObjectType);
2563}
2564
2565template<typename Derived>
2566QualType
2567TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2568                                                 RValueReferenceTypeLoc TL,
2569                                                     QualType ObjectType) {
2570  return TransformReferenceType(TLB, TL, ObjectType);
2571}
2572
2573template<typename Derived>
2574QualType
2575TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2576                                                   MemberPointerTypeLoc TL,
2577                                                   QualType ObjectType) {
2578  MemberPointerType *T = TL.getTypePtr();
2579
2580  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2581  if (PointeeType.isNull())
2582    return QualType();
2583
2584  // TODO: preserve source information for this.
2585  QualType ClassType
2586    = getDerived().TransformType(QualType(T->getClass(), 0));
2587  if (ClassType.isNull())
2588    return QualType();
2589
2590  QualType Result = TL.getType();
2591  if (getDerived().AlwaysRebuild() ||
2592      PointeeType != T->getPointeeType() ||
2593      ClassType != QualType(T->getClass(), 0)) {
2594    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
2595                                                   TL.getStarLoc());
2596    if (Result.isNull())
2597      return QualType();
2598  }
2599
2600  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2601  NewTL.setSigilLoc(TL.getSigilLoc());
2602
2603  return Result;
2604}
2605
2606template<typename Derived>
2607QualType
2608TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2609                                                   ConstantArrayTypeLoc TL,
2610                                                   QualType ObjectType) {
2611  ConstantArrayType *T = TL.getTypePtr();
2612  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2613  if (ElementType.isNull())
2614    return QualType();
2615
2616  QualType Result = TL.getType();
2617  if (getDerived().AlwaysRebuild() ||
2618      ElementType != T->getElementType()) {
2619    Result = getDerived().RebuildConstantArrayType(ElementType,
2620                                                   T->getSizeModifier(),
2621                                                   T->getSize(),
2622                                             T->getIndexTypeCVRQualifiers(),
2623                                                   TL.getBracketsRange());
2624    if (Result.isNull())
2625      return QualType();
2626  }
2627
2628  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2629  NewTL.setLBracketLoc(TL.getLBracketLoc());
2630  NewTL.setRBracketLoc(TL.getRBracketLoc());
2631
2632  Expr *Size = TL.getSizeExpr();
2633  if (Size) {
2634    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2635    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2636  }
2637  NewTL.setSizeExpr(Size);
2638
2639  return Result;
2640}
2641
2642template<typename Derived>
2643QualType TreeTransform<Derived>::TransformIncompleteArrayType(
2644                                              TypeLocBuilder &TLB,
2645                                              IncompleteArrayTypeLoc TL,
2646                                              QualType ObjectType) {
2647  IncompleteArrayType *T = TL.getTypePtr();
2648  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2649  if (ElementType.isNull())
2650    return QualType();
2651
2652  QualType Result = TL.getType();
2653  if (getDerived().AlwaysRebuild() ||
2654      ElementType != T->getElementType()) {
2655    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2656                                                     T->getSizeModifier(),
2657                                           T->getIndexTypeCVRQualifiers(),
2658                                                     TL.getBracketsRange());
2659    if (Result.isNull())
2660      return QualType();
2661  }
2662
2663  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2664  NewTL.setLBracketLoc(TL.getLBracketLoc());
2665  NewTL.setRBracketLoc(TL.getRBracketLoc());
2666  NewTL.setSizeExpr(0);
2667
2668  return Result;
2669}
2670
2671template<typename Derived>
2672QualType
2673TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2674                                                   VariableArrayTypeLoc TL,
2675                                                   QualType ObjectType) {
2676  VariableArrayType *T = TL.getTypePtr();
2677  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2678  if (ElementType.isNull())
2679    return QualType();
2680
2681  // Array bounds are not potentially evaluated contexts
2682  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2683
2684  Sema::OwningExprResult SizeResult
2685    = getDerived().TransformExpr(T->getSizeExpr());
2686  if (SizeResult.isInvalid())
2687    return QualType();
2688
2689  Expr *Size = static_cast<Expr*>(SizeResult.get());
2690
2691  QualType Result = TL.getType();
2692  if (getDerived().AlwaysRebuild() ||
2693      ElementType != T->getElementType() ||
2694      Size != T->getSizeExpr()) {
2695    Result = getDerived().RebuildVariableArrayType(ElementType,
2696                                                   T->getSizeModifier(),
2697                                                   move(SizeResult),
2698                                             T->getIndexTypeCVRQualifiers(),
2699                                                   TL.getBracketsRange());
2700    if (Result.isNull())
2701      return QualType();
2702  }
2703  else SizeResult.take();
2704
2705  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2706  NewTL.setLBracketLoc(TL.getLBracketLoc());
2707  NewTL.setRBracketLoc(TL.getRBracketLoc());
2708  NewTL.setSizeExpr(Size);
2709
2710  return Result;
2711}
2712
2713template<typename Derived>
2714QualType
2715TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2716                                             DependentSizedArrayTypeLoc TL,
2717                                                        QualType ObjectType) {
2718  DependentSizedArrayType *T = TL.getTypePtr();
2719  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2720  if (ElementType.isNull())
2721    return QualType();
2722
2723  // Array bounds are not potentially evaluated contexts
2724  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2725
2726  Sema::OwningExprResult SizeResult
2727    = getDerived().TransformExpr(T->getSizeExpr());
2728  if (SizeResult.isInvalid())
2729    return QualType();
2730
2731  Expr *Size = static_cast<Expr*>(SizeResult.get());
2732
2733  QualType Result = TL.getType();
2734  if (getDerived().AlwaysRebuild() ||
2735      ElementType != T->getElementType() ||
2736      Size != T->getSizeExpr()) {
2737    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2738                                                         T->getSizeModifier(),
2739                                                         move(SizeResult),
2740                                                T->getIndexTypeCVRQualifiers(),
2741                                                        TL.getBracketsRange());
2742    if (Result.isNull())
2743      return QualType();
2744  }
2745  else SizeResult.take();
2746
2747  // We might have any sort of array type now, but fortunately they
2748  // all have the same location layout.
2749  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2750  NewTL.setLBracketLoc(TL.getLBracketLoc());
2751  NewTL.setRBracketLoc(TL.getRBracketLoc());
2752  NewTL.setSizeExpr(Size);
2753
2754  return Result;
2755}
2756
2757template<typename Derived>
2758QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2759                                      TypeLocBuilder &TLB,
2760                                      DependentSizedExtVectorTypeLoc TL,
2761                                      QualType ObjectType) {
2762  DependentSizedExtVectorType *T = TL.getTypePtr();
2763
2764  // FIXME: ext vector locs should be nested
2765  QualType ElementType = getDerived().TransformType(T->getElementType());
2766  if (ElementType.isNull())
2767    return QualType();
2768
2769  // Vector sizes are not potentially evaluated contexts
2770  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2771
2772  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2773  if (Size.isInvalid())
2774    return QualType();
2775
2776  QualType Result = TL.getType();
2777  if (getDerived().AlwaysRebuild() ||
2778      ElementType != T->getElementType() ||
2779      Size.get() != T->getSizeExpr()) {
2780    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2781                                                         move(Size),
2782                                                         T->getAttributeLoc());
2783    if (Result.isNull())
2784      return QualType();
2785  }
2786  else Size.take();
2787
2788  // Result might be dependent or not.
2789  if (isa<DependentSizedExtVectorType>(Result)) {
2790    DependentSizedExtVectorTypeLoc NewTL
2791      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2792    NewTL.setNameLoc(TL.getNameLoc());
2793  } else {
2794    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2795    NewTL.setNameLoc(TL.getNameLoc());
2796  }
2797
2798  return Result;
2799}
2800
2801template<typename Derived>
2802QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2803                                                     VectorTypeLoc TL,
2804                                                     QualType ObjectType) {
2805  VectorType *T = TL.getTypePtr();
2806  QualType ElementType = getDerived().TransformType(T->getElementType());
2807  if (ElementType.isNull())
2808    return QualType();
2809
2810  QualType Result = TL.getType();
2811  if (getDerived().AlwaysRebuild() ||
2812      ElementType != T->getElementType()) {
2813    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
2814      T->getAltiVecSpecific());
2815    if (Result.isNull())
2816      return QualType();
2817  }
2818
2819  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2820  NewTL.setNameLoc(TL.getNameLoc());
2821
2822  return Result;
2823}
2824
2825template<typename Derived>
2826QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2827                                                        ExtVectorTypeLoc TL,
2828                                                        QualType ObjectType) {
2829  VectorType *T = TL.getTypePtr();
2830  QualType ElementType = getDerived().TransformType(T->getElementType());
2831  if (ElementType.isNull())
2832    return QualType();
2833
2834  QualType Result = TL.getType();
2835  if (getDerived().AlwaysRebuild() ||
2836      ElementType != T->getElementType()) {
2837    Result = getDerived().RebuildExtVectorType(ElementType,
2838                                               T->getNumElements(),
2839                                               /*FIXME*/ SourceLocation());
2840    if (Result.isNull())
2841      return QualType();
2842  }
2843
2844  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2845  NewTL.setNameLoc(TL.getNameLoc());
2846
2847  return Result;
2848}
2849
2850template<typename Derived>
2851ParmVarDecl *
2852TreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
2853  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
2854  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
2855  if (!NewDI)
2856    return 0;
2857
2858  if (NewDI == OldDI)
2859    return OldParm;
2860  else
2861    return ParmVarDecl::Create(SemaRef.Context,
2862                               OldParm->getDeclContext(),
2863                               OldParm->getLocation(),
2864                               OldParm->getIdentifier(),
2865                               NewDI->getType(),
2866                               NewDI,
2867                               OldParm->getStorageClass(),
2868                               OldParm->getStorageClassAsWritten(),
2869                               /* DefArg */ NULL);
2870}
2871
2872template<typename Derived>
2873bool TreeTransform<Derived>::
2874  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
2875                              llvm::SmallVectorImpl<QualType> &PTypes,
2876                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2877  FunctionProtoType *T = TL.getTypePtr();
2878
2879  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2880    ParmVarDecl *OldParm = TL.getArg(i);
2881
2882    QualType NewType;
2883    ParmVarDecl *NewParm;
2884
2885    if (OldParm) {
2886      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
2887      if (!NewParm)
2888        return true;
2889      NewType = NewParm->getType();
2890
2891    // Deal with the possibility that we don't have a parameter
2892    // declaration for this parameter.
2893    } else {
2894      NewParm = 0;
2895
2896      QualType OldType = T->getArgType(i);
2897      NewType = getDerived().TransformType(OldType);
2898      if (NewType.isNull())
2899        return true;
2900    }
2901
2902    PTypes.push_back(NewType);
2903    PVars.push_back(NewParm);
2904  }
2905
2906  return false;
2907}
2908
2909template<typename Derived>
2910QualType
2911TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2912                                                   FunctionProtoTypeLoc TL,
2913                                                   QualType ObjectType) {
2914  // Transform the parameters. We do this first for the benefit of template
2915  // instantiations, so that the ParmVarDecls get/ placed into the template
2916  // instantiation scope before we transform the function type.
2917  llvm::SmallVector<QualType, 4> ParamTypes;
2918  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2919  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
2920    return QualType();
2921
2922  FunctionProtoType *T = TL.getTypePtr();
2923  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2924  if (ResultType.isNull())
2925    return QualType();
2926
2927  QualType Result = TL.getType();
2928  if (getDerived().AlwaysRebuild() ||
2929      ResultType != T->getResultType() ||
2930      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2931    Result = getDerived().RebuildFunctionProtoType(ResultType,
2932                                                   ParamTypes.data(),
2933                                                   ParamTypes.size(),
2934                                                   T->isVariadic(),
2935                                                   T->getTypeQuals());
2936    if (Result.isNull())
2937      return QualType();
2938  }
2939
2940  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2941  NewTL.setLParenLoc(TL.getLParenLoc());
2942  NewTL.setRParenLoc(TL.getRParenLoc());
2943  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2944    NewTL.setArg(i, ParamDecls[i]);
2945
2946  return Result;
2947}
2948
2949template<typename Derived>
2950QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2951                                                 TypeLocBuilder &TLB,
2952                                                 FunctionNoProtoTypeLoc TL,
2953                                                 QualType ObjectType) {
2954  FunctionNoProtoType *T = TL.getTypePtr();
2955  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2956  if (ResultType.isNull())
2957    return QualType();
2958
2959  QualType Result = TL.getType();
2960  if (getDerived().AlwaysRebuild() ||
2961      ResultType != T->getResultType())
2962    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2963
2964  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2965  NewTL.setLParenLoc(TL.getLParenLoc());
2966  NewTL.setRParenLoc(TL.getRParenLoc());
2967
2968  return Result;
2969}
2970
2971template<typename Derived> QualType
2972TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2973                                                 UnresolvedUsingTypeLoc TL,
2974                                                     QualType ObjectType) {
2975  UnresolvedUsingType *T = TL.getTypePtr();
2976  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2977  if (!D)
2978    return QualType();
2979
2980  QualType Result = TL.getType();
2981  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2982    Result = getDerived().RebuildUnresolvedUsingType(D);
2983    if (Result.isNull())
2984      return QualType();
2985  }
2986
2987  // We might get an arbitrary type spec type back.  We should at
2988  // least always get a type spec type, though.
2989  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2990  NewTL.setNameLoc(TL.getNameLoc());
2991
2992  return Result;
2993}
2994
2995template<typename Derived>
2996QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2997                                                      TypedefTypeLoc TL,
2998                                                      QualType ObjectType) {
2999  TypedefType *T = TL.getTypePtr();
3000  TypedefDecl *Typedef
3001    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
3002                                                           T->getDecl()));
3003  if (!Typedef)
3004    return QualType();
3005
3006  QualType Result = TL.getType();
3007  if (getDerived().AlwaysRebuild() ||
3008      Typedef != T->getDecl()) {
3009    Result = getDerived().RebuildTypedefType(Typedef);
3010    if (Result.isNull())
3011      return QualType();
3012  }
3013
3014  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3015  NewTL.setNameLoc(TL.getNameLoc());
3016
3017  return Result;
3018}
3019
3020template<typename Derived>
3021QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3022                                                      TypeOfExprTypeLoc TL,
3023                                                       QualType ObjectType) {
3024  // typeof expressions are not potentially evaluated contexts
3025  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3026
3027  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3028  if (E.isInvalid())
3029    return QualType();
3030
3031  QualType Result = TL.getType();
3032  if (getDerived().AlwaysRebuild() ||
3033      E.get() != TL.getUnderlyingExpr()) {
3034    Result = getDerived().RebuildTypeOfExprType(move(E));
3035    if (Result.isNull())
3036      return QualType();
3037  }
3038  else E.take();
3039
3040  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3041  NewTL.setTypeofLoc(TL.getTypeofLoc());
3042  NewTL.setLParenLoc(TL.getLParenLoc());
3043  NewTL.setRParenLoc(TL.getRParenLoc());
3044
3045  return Result;
3046}
3047
3048template<typename Derived>
3049QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3050                                                     TypeOfTypeLoc TL,
3051                                                     QualType ObjectType) {
3052  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3053  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3054  if (!New_Under_TI)
3055    return QualType();
3056
3057  QualType Result = TL.getType();
3058  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3059    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3060    if (Result.isNull())
3061      return QualType();
3062  }
3063
3064  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3065  NewTL.setTypeofLoc(TL.getTypeofLoc());
3066  NewTL.setLParenLoc(TL.getLParenLoc());
3067  NewTL.setRParenLoc(TL.getRParenLoc());
3068  NewTL.setUnderlyingTInfo(New_Under_TI);
3069
3070  return Result;
3071}
3072
3073template<typename Derived>
3074QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3075                                                       DecltypeTypeLoc TL,
3076                                                       QualType ObjectType) {
3077  DecltypeType *T = TL.getTypePtr();
3078
3079  // decltype expressions are not potentially evaluated contexts
3080  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3081
3082  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3083  if (E.isInvalid())
3084    return QualType();
3085
3086  QualType Result = TL.getType();
3087  if (getDerived().AlwaysRebuild() ||
3088      E.get() != T->getUnderlyingExpr()) {
3089    Result = getDerived().RebuildDecltypeType(move(E));
3090    if (Result.isNull())
3091      return QualType();
3092  }
3093  else E.take();
3094
3095  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3096  NewTL.setNameLoc(TL.getNameLoc());
3097
3098  return Result;
3099}
3100
3101template<typename Derived>
3102QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3103                                                     RecordTypeLoc TL,
3104                                                     QualType ObjectType) {
3105  RecordType *T = TL.getTypePtr();
3106  RecordDecl *Record
3107    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
3108                                                          T->getDecl()));
3109  if (!Record)
3110    return QualType();
3111
3112  QualType Result = TL.getType();
3113  if (getDerived().AlwaysRebuild() ||
3114      Record != T->getDecl()) {
3115    Result = getDerived().RebuildRecordType(Record);
3116    if (Result.isNull())
3117      return QualType();
3118  }
3119
3120  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3121  NewTL.setNameLoc(TL.getNameLoc());
3122
3123  return Result;
3124}
3125
3126template<typename Derived>
3127QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3128                                                   EnumTypeLoc TL,
3129                                                   QualType ObjectType) {
3130  EnumType *T = TL.getTypePtr();
3131  EnumDecl *Enum
3132    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
3133                                                        T->getDecl()));
3134  if (!Enum)
3135    return QualType();
3136
3137  QualType Result = TL.getType();
3138  if (getDerived().AlwaysRebuild() ||
3139      Enum != T->getDecl()) {
3140    Result = getDerived().RebuildEnumType(Enum);
3141    if (Result.isNull())
3142      return QualType();
3143  }
3144
3145  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3146  NewTL.setNameLoc(TL.getNameLoc());
3147
3148  return Result;
3149}
3150
3151template<typename Derived>
3152QualType TreeTransform<Derived>::TransformInjectedClassNameType(
3153                                         TypeLocBuilder &TLB,
3154                                         InjectedClassNameTypeLoc TL,
3155                                         QualType ObjectType) {
3156  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
3157                                       TL.getTypePtr()->getDecl());
3158  if (!D) return QualType();
3159
3160  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
3161  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
3162  return T;
3163}
3164
3165
3166template<typename Derived>
3167QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3168                                                TypeLocBuilder &TLB,
3169                                                TemplateTypeParmTypeLoc TL,
3170                                                QualType ObjectType) {
3171  return TransformTypeSpecType(TLB, TL);
3172}
3173
3174template<typename Derived>
3175QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3176                                         TypeLocBuilder &TLB,
3177                                         SubstTemplateTypeParmTypeLoc TL,
3178                                         QualType ObjectType) {
3179  return TransformTypeSpecType(TLB, TL);
3180}
3181
3182template<typename Derived>
3183QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3184                                      const TemplateSpecializationType *TST,
3185                                                        QualType ObjectType) {
3186  // FIXME: this entire method is a temporary workaround; callers
3187  // should be rewritten to provide real type locs.
3188
3189  // Fake up a TemplateSpecializationTypeLoc.
3190  TypeLocBuilder TLB;
3191  TemplateSpecializationTypeLoc TL
3192    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3193
3194  SourceLocation BaseLoc = getDerived().getBaseLocation();
3195
3196  TL.setTemplateNameLoc(BaseLoc);
3197  TL.setLAngleLoc(BaseLoc);
3198  TL.setRAngleLoc(BaseLoc);
3199  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3200    const TemplateArgument &TA = TST->getArg(i);
3201    TemplateArgumentLoc TAL;
3202    getDerived().InventTemplateArgumentLoc(TA, TAL);
3203    TL.setArgLocInfo(i, TAL.getLocInfo());
3204  }
3205
3206  TypeLocBuilder IgnoredTLB;
3207  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3208}
3209
3210template<typename Derived>
3211QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3212                                                        TypeLocBuilder &TLB,
3213                                           TemplateSpecializationTypeLoc TL,
3214                                                        QualType ObjectType) {
3215  const TemplateSpecializationType *T = TL.getTypePtr();
3216
3217  TemplateName Template
3218    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3219  if (Template.isNull())
3220    return QualType();
3221
3222  TemplateArgumentListInfo NewTemplateArgs;
3223  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3224  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3225
3226  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3227    TemplateArgumentLoc Loc;
3228    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3229      return QualType();
3230    NewTemplateArgs.addArgument(Loc);
3231  }
3232
3233  // FIXME: maybe don't rebuild if all the template arguments are the same.
3234
3235  QualType Result =
3236    getDerived().RebuildTemplateSpecializationType(Template,
3237                                                   TL.getTemplateNameLoc(),
3238                                                   NewTemplateArgs);
3239
3240  if (!Result.isNull()) {
3241    TemplateSpecializationTypeLoc NewTL
3242      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3243    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3244    NewTL.setLAngleLoc(TL.getLAngleLoc());
3245    NewTL.setRAngleLoc(TL.getRAngleLoc());
3246    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3247      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3248  }
3249
3250  return Result;
3251}
3252
3253template<typename Derived>
3254QualType
3255TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3256                                                ElaboratedTypeLoc TL,
3257                                                QualType ObjectType) {
3258  ElaboratedType *T = TL.getTypePtr();
3259
3260  NestedNameSpecifier *NNS = 0;
3261  // NOTE: the qualifier in an ElaboratedType is optional.
3262  if (T->getQualifier() != 0) {
3263    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3264                                                    TL.getQualifierRange(),
3265                                                    ObjectType);
3266    if (!NNS)
3267      return QualType();
3268  }
3269
3270  QualType NamedT;
3271  // FIXME: this test is meant to workaround a problem (failing assertion)
3272  // occurring if directly executing the code in the else branch.
3273  if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
3274    TemplateSpecializationTypeLoc OldNamedTL
3275      = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
3276    const TemplateSpecializationType* OldTST
3277      = OldNamedTL.getType()->template getAs<TemplateSpecializationType>();
3278    NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
3279    if (NamedT.isNull())
3280      return QualType();
3281    TemplateSpecializationTypeLoc NewNamedTL
3282      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3283    NewNamedTL.copy(OldNamedTL);
3284  }
3285  else {
3286    NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3287    if (NamedT.isNull())
3288      return QualType();
3289  }
3290
3291  QualType Result = TL.getType();
3292  if (getDerived().AlwaysRebuild() ||
3293      NNS != T->getQualifier() ||
3294      NamedT != T->getNamedType()) {
3295    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
3296    if (Result.isNull())
3297      return QualType();
3298  }
3299
3300  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3301  NewTL.setKeywordLoc(TL.getKeywordLoc());
3302  NewTL.setQualifierRange(TL.getQualifierRange());
3303
3304  return Result;
3305}
3306
3307template<typename Derived>
3308QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
3309                                                       DependentNameTypeLoc TL,
3310                                                       QualType ObjectType) {
3311  DependentNameType *T = TL.getTypePtr();
3312
3313  NestedNameSpecifier *NNS
3314    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3315                                                TL.getQualifierRange(),
3316                                                ObjectType);
3317  if (!NNS)
3318    return QualType();
3319
3320  QualType Result
3321    = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
3322                                            T->getIdentifier(),
3323                                            TL.getKeywordLoc(),
3324                                            TL.getQualifierRange(),
3325                                            TL.getNameLoc());
3326  if (Result.isNull())
3327    return QualType();
3328
3329  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3330    QualType NamedT = ElabT->getNamedType();
3331    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
3332
3333    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3334    NewTL.setKeywordLoc(TL.getKeywordLoc());
3335    NewTL.setQualifierRange(TL.getQualifierRange());
3336  } else {
3337    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3338    NewTL.setKeywordLoc(TL.getKeywordLoc());
3339    NewTL.setQualifierRange(TL.getQualifierRange());
3340    NewTL.setNameLoc(TL.getNameLoc());
3341  }
3342  return Result;
3343}
3344
3345template<typename Derived>
3346QualType TreeTransform<Derived>::
3347          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
3348                                 DependentTemplateSpecializationTypeLoc TL,
3349                                                       QualType ObjectType) {
3350  DependentTemplateSpecializationType *T = TL.getTypePtr();
3351
3352  NestedNameSpecifier *NNS
3353    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3354                                                TL.getQualifierRange(),
3355                                                ObjectType);
3356  if (!NNS)
3357    return QualType();
3358
3359  TemplateArgumentListInfo NewTemplateArgs;
3360  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3361  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3362
3363  for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) {
3364    TemplateArgumentLoc Loc;
3365    if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc))
3366      return QualType();
3367    NewTemplateArgs.addArgument(Loc);
3368  }
3369
3370  QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
3371                                                     T->getKeyword(),
3372                                                     NNS,
3373                                                     T->getIdentifier(),
3374                                                     TL.getNameLoc(),
3375                                                     NewTemplateArgs);
3376  if (Result.isNull())
3377    return QualType();
3378
3379  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
3380    QualType NamedT = ElabT->getNamedType();
3381
3382    // Copy information relevant to the template specialization.
3383    TemplateSpecializationTypeLoc NamedTL
3384      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3385    NamedTL.setLAngleLoc(TL.getLAngleLoc());
3386    NamedTL.setRAngleLoc(TL.getRAngleLoc());
3387    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
3388      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
3389
3390    // Copy information relevant to the elaborated type.
3391    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3392    NewTL.setKeywordLoc(TL.getKeywordLoc());
3393    NewTL.setQualifierRange(TL.getQualifierRange());
3394  } else {
3395    TypeLoc NewTL(Result, TL.getOpaqueData());
3396    TLB.pushFullCopy(NewTL);
3397  }
3398  return Result;
3399}
3400
3401template<typename Derived>
3402QualType
3403TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3404                                                   ObjCInterfaceTypeLoc TL,
3405                                                   QualType ObjectType) {
3406  // ObjCInterfaceType is never dependent.
3407  TLB.pushFullCopy(TL);
3408  return TL.getType();
3409}
3410
3411template<typename Derived>
3412QualType
3413TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
3414                                                ObjCObjectTypeLoc TL,
3415                                                QualType ObjectType) {
3416  // ObjCObjectType is never dependent.
3417  TLB.pushFullCopy(TL);
3418  return TL.getType();
3419}
3420
3421template<typename Derived>
3422QualType
3423TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3424                                               ObjCObjectPointerTypeLoc TL,
3425                                                       QualType ObjectType) {
3426  // ObjCObjectPointerType is never dependent.
3427  TLB.pushFullCopy(TL);
3428  return TL.getType();
3429}
3430
3431//===----------------------------------------------------------------------===//
3432// Statement transformation
3433//===----------------------------------------------------------------------===//
3434template<typename Derived>
3435Sema::OwningStmtResult
3436TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
3437  return SemaRef.Owned(S->Retain());
3438}
3439
3440template<typename Derived>
3441Sema::OwningStmtResult
3442TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
3443  return getDerived().TransformCompoundStmt(S, false);
3444}
3445
3446template<typename Derived>
3447Sema::OwningStmtResult
3448TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
3449                                              bool IsStmtExpr) {
3450  bool SubStmtChanged = false;
3451  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
3452  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
3453       B != BEnd; ++B) {
3454    OwningStmtResult Result = getDerived().TransformStmt(*B);
3455    if (Result.isInvalid())
3456      return getSema().StmtError();
3457
3458    SubStmtChanged = SubStmtChanged || Result.get() != *B;
3459    Statements.push_back(Result.takeAs<Stmt>());
3460  }
3461
3462  if (!getDerived().AlwaysRebuild() &&
3463      !SubStmtChanged)
3464    return SemaRef.Owned(S->Retain());
3465
3466  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
3467                                          move_arg(Statements),
3468                                          S->getRBracLoc(),
3469                                          IsStmtExpr);
3470}
3471
3472template<typename Derived>
3473Sema::OwningStmtResult
3474TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3475  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3476  {
3477    // The case value expressions are not potentially evaluated.
3478    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3479
3480    // Transform the left-hand case value.
3481    LHS = getDerived().TransformExpr(S->getLHS());
3482    if (LHS.isInvalid())
3483      return SemaRef.StmtError();
3484
3485    // Transform the right-hand case value (for the GNU case-range extension).
3486    RHS = getDerived().TransformExpr(S->getRHS());
3487    if (RHS.isInvalid())
3488      return SemaRef.StmtError();
3489  }
3490
3491  // Build the case statement.
3492  // Case statements are always rebuilt so that they will attached to their
3493  // transformed switch statement.
3494  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
3495                                                       move(LHS),
3496                                                       S->getEllipsisLoc(),
3497                                                       move(RHS),
3498                                                       S->getColonLoc());
3499  if (Case.isInvalid())
3500    return SemaRef.StmtError();
3501
3502  // Transform the statement following the case
3503  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3504  if (SubStmt.isInvalid())
3505    return SemaRef.StmtError();
3506
3507  // Attach the body to the case statement
3508  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
3509}
3510
3511template<typename Derived>
3512Sema::OwningStmtResult
3513TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
3514  // Transform the statement following the default case
3515  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3516  if (SubStmt.isInvalid())
3517    return SemaRef.StmtError();
3518
3519  // Default statements are always rebuilt
3520  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
3521                                         move(SubStmt));
3522}
3523
3524template<typename Derived>
3525Sema::OwningStmtResult
3526TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
3527  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3528  if (SubStmt.isInvalid())
3529    return SemaRef.StmtError();
3530
3531  // FIXME: Pass the real colon location in.
3532  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
3533  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
3534                                       move(SubStmt));
3535}
3536
3537template<typename Derived>
3538Sema::OwningStmtResult
3539TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
3540  // Transform the condition
3541  OwningExprResult Cond(SemaRef);
3542  VarDecl *ConditionVar = 0;
3543  if (S->getConditionVariable()) {
3544    ConditionVar
3545      = cast_or_null<VarDecl>(
3546                   getDerived().TransformDefinition(
3547                                      S->getConditionVariable()->getLocation(),
3548                                                    S->getConditionVariable()));
3549    if (!ConditionVar)
3550      return SemaRef.StmtError();
3551  } else {
3552    Cond = getDerived().TransformExpr(S->getCond());
3553
3554    if (Cond.isInvalid())
3555      return SemaRef.StmtError();
3556
3557    // Convert the condition to a boolean value.
3558    if (S->getCond()) {
3559      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3560                                                               S->getIfLoc(),
3561                                                               move(Cond));
3562      if (CondE.isInvalid())
3563        return getSema().StmtError();
3564
3565      Cond = move(CondE);
3566    }
3567  }
3568
3569  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3570  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3571    return SemaRef.StmtError();
3572
3573  // Transform the "then" branch.
3574  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
3575  if (Then.isInvalid())
3576    return SemaRef.StmtError();
3577
3578  // Transform the "else" branch.
3579  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
3580  if (Else.isInvalid())
3581    return SemaRef.StmtError();
3582
3583  if (!getDerived().AlwaysRebuild() &&
3584      FullCond->get() == S->getCond() &&
3585      ConditionVar == S->getConditionVariable() &&
3586      Then.get() == S->getThen() &&
3587      Else.get() == S->getElse())
3588    return SemaRef.Owned(S->Retain());
3589
3590  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
3591                                    move(Then),
3592                                    S->getElseLoc(), move(Else));
3593}
3594
3595template<typename Derived>
3596Sema::OwningStmtResult
3597TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
3598  // Transform the condition.
3599  OwningExprResult Cond(SemaRef);
3600  VarDecl *ConditionVar = 0;
3601  if (S->getConditionVariable()) {
3602    ConditionVar
3603      = cast_or_null<VarDecl>(
3604                   getDerived().TransformDefinition(
3605                                      S->getConditionVariable()->getLocation(),
3606                                                    S->getConditionVariable()));
3607    if (!ConditionVar)
3608      return SemaRef.StmtError();
3609  } else {
3610    Cond = getDerived().TransformExpr(S->getCond());
3611
3612    if (Cond.isInvalid())
3613      return SemaRef.StmtError();
3614  }
3615
3616  // Rebuild the switch statement.
3617  OwningStmtResult Switch
3618    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), move(Cond),
3619                                          ConditionVar);
3620  if (Switch.isInvalid())
3621    return SemaRef.StmtError();
3622
3623  // Transform the body of the switch statement.
3624  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3625  if (Body.isInvalid())
3626    return SemaRef.StmtError();
3627
3628  // Complete the switch statement.
3629  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
3630                                            move(Body));
3631}
3632
3633template<typename Derived>
3634Sema::OwningStmtResult
3635TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
3636  // Transform the condition
3637  OwningExprResult Cond(SemaRef);
3638  VarDecl *ConditionVar = 0;
3639  if (S->getConditionVariable()) {
3640    ConditionVar
3641      = cast_or_null<VarDecl>(
3642                   getDerived().TransformDefinition(
3643                                      S->getConditionVariable()->getLocation(),
3644                                                    S->getConditionVariable()));
3645    if (!ConditionVar)
3646      return SemaRef.StmtError();
3647  } else {
3648    Cond = getDerived().TransformExpr(S->getCond());
3649
3650    if (Cond.isInvalid())
3651      return SemaRef.StmtError();
3652
3653    if (S->getCond()) {
3654      // Convert the condition to a boolean value.
3655      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3656                                                             S->getWhileLoc(),
3657                                                               move(Cond));
3658      if (CondE.isInvalid())
3659        return getSema().StmtError();
3660      Cond = move(CondE);
3661    }
3662  }
3663
3664  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3665  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3666    return SemaRef.StmtError();
3667
3668  // Transform the body
3669  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3670  if (Body.isInvalid())
3671    return SemaRef.StmtError();
3672
3673  if (!getDerived().AlwaysRebuild() &&
3674      FullCond->get() == S->getCond() &&
3675      ConditionVar == S->getConditionVariable() &&
3676      Body.get() == S->getBody())
3677    return SemaRef.Owned(S->Retain());
3678
3679  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
3680                                       ConditionVar, move(Body));
3681}
3682
3683template<typename Derived>
3684Sema::OwningStmtResult
3685TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
3686  // Transform the body
3687  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3688  if (Body.isInvalid())
3689    return SemaRef.StmtError();
3690
3691  // Transform the condition
3692  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3693  if (Cond.isInvalid())
3694    return SemaRef.StmtError();
3695
3696  if (!getDerived().AlwaysRebuild() &&
3697      Cond.get() == S->getCond() &&
3698      Body.get() == S->getBody())
3699    return SemaRef.Owned(S->Retain());
3700
3701  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
3702                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
3703                                    S->getRParenLoc());
3704}
3705
3706template<typename Derived>
3707Sema::OwningStmtResult
3708TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
3709  // Transform the initialization statement
3710  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
3711  if (Init.isInvalid())
3712    return SemaRef.StmtError();
3713
3714  // Transform the condition
3715  OwningExprResult Cond(SemaRef);
3716  VarDecl *ConditionVar = 0;
3717  if (S->getConditionVariable()) {
3718    ConditionVar
3719      = cast_or_null<VarDecl>(
3720                   getDerived().TransformDefinition(
3721                                      S->getConditionVariable()->getLocation(),
3722                                                    S->getConditionVariable()));
3723    if (!ConditionVar)
3724      return SemaRef.StmtError();
3725  } else {
3726    Cond = getDerived().TransformExpr(S->getCond());
3727
3728    if (Cond.isInvalid())
3729      return SemaRef.StmtError();
3730
3731    if (S->getCond()) {
3732      // Convert the condition to a boolean value.
3733      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3734                                                               S->getForLoc(),
3735                                                               move(Cond));
3736      if (CondE.isInvalid())
3737        return getSema().StmtError();
3738
3739      Cond = move(CondE);
3740    }
3741  }
3742
3743  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3744  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3745    return SemaRef.StmtError();
3746
3747  // Transform the increment
3748  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
3749  if (Inc.isInvalid())
3750    return SemaRef.StmtError();
3751
3752  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc));
3753  if (S->getInc() && !FullInc->get())
3754    return SemaRef.StmtError();
3755
3756  // Transform the body
3757  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3758  if (Body.isInvalid())
3759    return SemaRef.StmtError();
3760
3761  if (!getDerived().AlwaysRebuild() &&
3762      Init.get() == S->getInit() &&
3763      FullCond->get() == S->getCond() &&
3764      Inc.get() == S->getInc() &&
3765      Body.get() == S->getBody())
3766    return SemaRef.Owned(S->Retain());
3767
3768  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3769                                     move(Init), FullCond, ConditionVar,
3770                                     FullInc, S->getRParenLoc(), move(Body));
3771}
3772
3773template<typename Derived>
3774Sema::OwningStmtResult
3775TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
3776  // Goto statements must always be rebuilt, to resolve the label.
3777  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
3778                                      S->getLabel());
3779}
3780
3781template<typename Derived>
3782Sema::OwningStmtResult
3783TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
3784  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
3785  if (Target.isInvalid())
3786    return SemaRef.StmtError();
3787
3788  if (!getDerived().AlwaysRebuild() &&
3789      Target.get() == S->getTarget())
3790    return SemaRef.Owned(S->Retain());
3791
3792  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
3793                                              move(Target));
3794}
3795
3796template<typename Derived>
3797Sema::OwningStmtResult
3798TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
3799  return SemaRef.Owned(S->Retain());
3800}
3801
3802template<typename Derived>
3803Sema::OwningStmtResult
3804TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
3805  return SemaRef.Owned(S->Retain());
3806}
3807
3808template<typename Derived>
3809Sema::OwningStmtResult
3810TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
3811  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
3812  if (Result.isInvalid())
3813    return SemaRef.StmtError();
3814
3815  // FIXME: We always rebuild the return statement because there is no way
3816  // to tell whether the return type of the function has changed.
3817  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
3818}
3819
3820template<typename Derived>
3821Sema::OwningStmtResult
3822TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
3823  bool DeclChanged = false;
3824  llvm::SmallVector<Decl *, 4> Decls;
3825  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
3826       D != DEnd; ++D) {
3827    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3828                                                         *D);
3829    if (!Transformed)
3830      return SemaRef.StmtError();
3831
3832    if (Transformed != *D)
3833      DeclChanged = true;
3834
3835    Decls.push_back(Transformed);
3836  }
3837
3838  if (!getDerived().AlwaysRebuild() && !DeclChanged)
3839    return SemaRef.Owned(S->Retain());
3840
3841  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
3842                                      S->getStartLoc(), S->getEndLoc());
3843}
3844
3845template<typename Derived>
3846Sema::OwningStmtResult
3847TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
3848  assert(false && "SwitchCase is abstract and cannot be transformed");
3849  return SemaRef.Owned(S->Retain());
3850}
3851
3852template<typename Derived>
3853Sema::OwningStmtResult
3854TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3855
3856  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema());
3857  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema());
3858  llvm::SmallVector<IdentifierInfo *, 4> Names;
3859
3860  OwningExprResult AsmString(SemaRef);
3861  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema());
3862
3863  bool ExprsChanged = false;
3864
3865  // Go through the outputs.
3866  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3867    Names.push_back(S->getOutputIdentifier(I));
3868
3869    // No need to transform the constraint literal.
3870    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3871
3872    // Transform the output expr.
3873    Expr *OutputExpr = S->getOutputExpr(I);
3874    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3875    if (Result.isInvalid())
3876      return SemaRef.StmtError();
3877
3878    ExprsChanged |= Result.get() != OutputExpr;
3879
3880    Exprs.push_back(Result.takeAs<Expr>());
3881  }
3882
3883  // Go through the inputs.
3884  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3885    Names.push_back(S->getInputIdentifier(I));
3886
3887    // No need to transform the constraint literal.
3888    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3889
3890    // Transform the input expr.
3891    Expr *InputExpr = S->getInputExpr(I);
3892    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3893    if (Result.isInvalid())
3894      return SemaRef.StmtError();
3895
3896    ExprsChanged |= Result.get() != InputExpr;
3897
3898    Exprs.push_back(Result.takeAs<Expr>());
3899  }
3900
3901  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3902    return SemaRef.Owned(S->Retain());
3903
3904  // Go through the clobbers.
3905  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3906    Clobbers.push_back(S->getClobber(I)->Retain());
3907
3908  // No need to transform the asm string literal.
3909  AsmString = SemaRef.Owned(S->getAsmString());
3910
3911  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3912                                     S->isSimple(),
3913                                     S->isVolatile(),
3914                                     S->getNumOutputs(),
3915                                     S->getNumInputs(),
3916                                     Names.data(),
3917                                     move_arg(Constraints),
3918                                     move_arg(Exprs),
3919                                     move(AsmString),
3920                                     move_arg(Clobbers),
3921                                     S->getRParenLoc(),
3922                                     S->isMSAsm());
3923}
3924
3925
3926template<typename Derived>
3927Sema::OwningStmtResult
3928TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
3929  // Transform the body of the @try.
3930  OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
3931  if (TryBody.isInvalid())
3932    return SemaRef.StmtError();
3933
3934  // Transform the @catch statements (if present).
3935  bool AnyCatchChanged = false;
3936  ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef);
3937  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
3938    OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
3939    if (Catch.isInvalid())
3940      return SemaRef.StmtError();
3941    if (Catch.get() != S->getCatchStmt(I))
3942      AnyCatchChanged = true;
3943    CatchStmts.push_back(Catch.release());
3944  }
3945
3946  // Transform the @finally statement (if present).
3947  OwningStmtResult Finally(SemaRef);
3948  if (S->getFinallyStmt()) {
3949    Finally = getDerived().TransformStmt(S->getFinallyStmt());
3950    if (Finally.isInvalid())
3951      return SemaRef.StmtError();
3952  }
3953
3954  // If nothing changed, just retain this statement.
3955  if (!getDerived().AlwaysRebuild() &&
3956      TryBody.get() == S->getTryBody() &&
3957      !AnyCatchChanged &&
3958      Finally.get() == S->getFinallyStmt())
3959    return SemaRef.Owned(S->Retain());
3960
3961  // Build a new statement.
3962  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody),
3963                                           move_arg(CatchStmts), move(Finally));
3964}
3965
3966template<typename Derived>
3967Sema::OwningStmtResult
3968TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3969  // Transform the @catch parameter, if there is one.
3970  VarDecl *Var = 0;
3971  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3972    TypeSourceInfo *TSInfo = 0;
3973    if (FromVar->getTypeSourceInfo()) {
3974      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3975      if (!TSInfo)
3976        return SemaRef.StmtError();
3977    }
3978
3979    QualType T;
3980    if (TSInfo)
3981      T = TSInfo->getType();
3982    else {
3983      T = getDerived().TransformType(FromVar->getType());
3984      if (T.isNull())
3985        return SemaRef.StmtError();
3986    }
3987
3988    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3989    if (!Var)
3990      return SemaRef.StmtError();
3991  }
3992
3993  OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3994  if (Body.isInvalid())
3995    return SemaRef.StmtError();
3996
3997  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
3998                                             S->getRParenLoc(),
3999                                             Var, move(Body));
4000}
4001
4002template<typename Derived>
4003Sema::OwningStmtResult
4004TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
4005  // Transform the body.
4006  OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
4007  if (Body.isInvalid())
4008    return SemaRef.StmtError();
4009
4010  // If nothing changed, just retain this statement.
4011  if (!getDerived().AlwaysRebuild() &&
4012      Body.get() == S->getFinallyBody())
4013    return SemaRef.Owned(S->Retain());
4014
4015  // Build a new statement.
4016  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
4017                                               move(Body));
4018}
4019
4020template<typename Derived>
4021Sema::OwningStmtResult
4022TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
4023  OwningExprResult Operand(SemaRef);
4024  if (S->getThrowExpr()) {
4025    Operand = getDerived().TransformExpr(S->getThrowExpr());
4026    if (Operand.isInvalid())
4027      return getSema().StmtError();
4028  }
4029
4030  if (!getDerived().AlwaysRebuild() &&
4031      Operand.get() == S->getThrowExpr())
4032    return getSema().Owned(S->Retain());
4033
4034  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), move(Operand));
4035}
4036
4037template<typename Derived>
4038Sema::OwningStmtResult
4039TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
4040                                                  ObjCAtSynchronizedStmt *S) {
4041  // Transform the object we are locking.
4042  OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
4043  if (Object.isInvalid())
4044    return SemaRef.StmtError();
4045
4046  // Transform the body.
4047  OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody());
4048  if (Body.isInvalid())
4049    return SemaRef.StmtError();
4050
4051  // If nothing change, just retain the current statement.
4052  if (!getDerived().AlwaysRebuild() &&
4053      Object.get() == S->getSynchExpr() &&
4054      Body.get() == S->getSynchBody())
4055    return SemaRef.Owned(S->Retain());
4056
4057  // Build a new statement.
4058  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
4059                                                    move(Object), move(Body));
4060}
4061
4062template<typename Derived>
4063Sema::OwningStmtResult
4064TreeTransform<Derived>::TransformObjCForCollectionStmt(
4065                                                  ObjCForCollectionStmt *S) {
4066  // Transform the element statement.
4067  OwningStmtResult Element = getDerived().TransformStmt(S->getElement());
4068  if (Element.isInvalid())
4069    return SemaRef.StmtError();
4070
4071  // Transform the collection expression.
4072  OwningExprResult Collection = getDerived().TransformExpr(S->getCollection());
4073  if (Collection.isInvalid())
4074    return SemaRef.StmtError();
4075
4076  // Transform the body.
4077  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
4078  if (Body.isInvalid())
4079    return SemaRef.StmtError();
4080
4081  // If nothing changed, just retain this statement.
4082  if (!getDerived().AlwaysRebuild() &&
4083      Element.get() == S->getElement() &&
4084      Collection.get() == S->getCollection() &&
4085      Body.get() == S->getBody())
4086    return SemaRef.Owned(S->Retain());
4087
4088  // Build a new statement.
4089  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4090                                                   /*FIXME:*/S->getForLoc(),
4091                                                   move(Element),
4092                                                   move(Collection),
4093                                                   S->getRParenLoc(),
4094                                                   move(Body));
4095}
4096
4097
4098template<typename Derived>
4099Sema::OwningStmtResult
4100TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
4101  // Transform the exception declaration, if any.
4102  VarDecl *Var = 0;
4103  if (S->getExceptionDecl()) {
4104    VarDecl *ExceptionDecl = S->getExceptionDecl();
4105    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
4106                         ExceptionDecl->getDeclName());
4107
4108    QualType T = getDerived().TransformType(ExceptionDecl->getType());
4109    if (T.isNull())
4110      return SemaRef.StmtError();
4111
4112    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
4113                                            T,
4114                                            ExceptionDecl->getTypeSourceInfo(),
4115                                            ExceptionDecl->getIdentifier(),
4116                                            ExceptionDecl->getLocation(),
4117                                            /*FIXME: Inaccurate*/
4118                                    SourceRange(ExceptionDecl->getLocation()));
4119    if (!Var || Var->isInvalidDecl()) {
4120      if (Var)
4121        Var->Destroy(SemaRef.Context);
4122      return SemaRef.StmtError();
4123    }
4124  }
4125
4126  // Transform the actual exception handler.
4127  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
4128  if (Handler.isInvalid()) {
4129    if (Var)
4130      Var->Destroy(SemaRef.Context);
4131    return SemaRef.StmtError();
4132  }
4133
4134  if (!getDerived().AlwaysRebuild() &&
4135      !Var &&
4136      Handler.get() == S->getHandlerBlock())
4137    return SemaRef.Owned(S->Retain());
4138
4139  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
4140                                          Var,
4141                                          move(Handler));
4142}
4143
4144template<typename Derived>
4145Sema::OwningStmtResult
4146TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
4147  // Transform the try block itself.
4148  OwningStmtResult TryBlock
4149    = getDerived().TransformCompoundStmt(S->getTryBlock());
4150  if (TryBlock.isInvalid())
4151    return SemaRef.StmtError();
4152
4153  // Transform the handlers.
4154  bool HandlerChanged = false;
4155  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
4156  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
4157    OwningStmtResult Handler
4158      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
4159    if (Handler.isInvalid())
4160      return SemaRef.StmtError();
4161
4162    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
4163    Handlers.push_back(Handler.takeAs<Stmt>());
4164  }
4165
4166  if (!getDerived().AlwaysRebuild() &&
4167      TryBlock.get() == S->getTryBlock() &&
4168      !HandlerChanged)
4169    return SemaRef.Owned(S->Retain());
4170
4171  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
4172                                        move_arg(Handlers));
4173}
4174
4175//===----------------------------------------------------------------------===//
4176// Expression transformation
4177//===----------------------------------------------------------------------===//
4178template<typename Derived>
4179Sema::OwningExprResult
4180TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
4181  return SemaRef.Owned(E->Retain());
4182}
4183
4184template<typename Derived>
4185Sema::OwningExprResult
4186TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4187  NestedNameSpecifier *Qualifier = 0;
4188  if (E->getQualifier()) {
4189    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4190                                                       E->getQualifierRange());
4191    if (!Qualifier)
4192      return SemaRef.ExprError();
4193  }
4194
4195  ValueDecl *ND
4196    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
4197                                                         E->getDecl()));
4198  if (!ND)
4199    return SemaRef.ExprError();
4200
4201  if (!getDerived().AlwaysRebuild() &&
4202      Qualifier == E->getQualifier() &&
4203      ND == E->getDecl() &&
4204      !E->hasExplicitTemplateArgumentList()) {
4205
4206    // Mark it referenced in the new context regardless.
4207    // FIXME: this is a bit instantiation-specific.
4208    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4209
4210    return SemaRef.Owned(E->Retain());
4211  }
4212
4213  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4214  if (E->hasExplicitTemplateArgumentList()) {
4215    TemplateArgs = &TransArgs;
4216    TransArgs.setLAngleLoc(E->getLAngleLoc());
4217    TransArgs.setRAngleLoc(E->getRAngleLoc());
4218    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4219      TemplateArgumentLoc Loc;
4220      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4221        return SemaRef.ExprError();
4222      TransArgs.addArgument(Loc);
4223    }
4224  }
4225
4226  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
4227                                         ND, E->getLocation(), TemplateArgs);
4228}
4229
4230template<typename Derived>
4231Sema::OwningExprResult
4232TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
4233  return SemaRef.Owned(E->Retain());
4234}
4235
4236template<typename Derived>
4237Sema::OwningExprResult
4238TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
4239  return SemaRef.Owned(E->Retain());
4240}
4241
4242template<typename Derived>
4243Sema::OwningExprResult
4244TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
4245  return SemaRef.Owned(E->Retain());
4246}
4247
4248template<typename Derived>
4249Sema::OwningExprResult
4250TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
4251  return SemaRef.Owned(E->Retain());
4252}
4253
4254template<typename Derived>
4255Sema::OwningExprResult
4256TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
4257  return SemaRef.Owned(E->Retain());
4258}
4259
4260template<typename Derived>
4261Sema::OwningExprResult
4262TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
4263  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4264  if (SubExpr.isInvalid())
4265    return SemaRef.ExprError();
4266
4267  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
4268    return SemaRef.Owned(E->Retain());
4269
4270  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
4271                                       E->getRParen());
4272}
4273
4274template<typename Derived>
4275Sema::OwningExprResult
4276TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
4277  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4278  if (SubExpr.isInvalid())
4279    return SemaRef.ExprError();
4280
4281  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
4282    return SemaRef.Owned(E->Retain());
4283
4284  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4285                                           E->getOpcode(),
4286                                           move(SubExpr));
4287}
4288
4289template<typename Derived>
4290Sema::OwningExprResult
4291TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
4292  // Transform the type.
4293  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
4294  if (!Type)
4295    return getSema().ExprError();
4296
4297  // Transform all of the components into components similar to what the
4298  // parser uses.
4299  // FIXME: It would be slightly more efficient in the non-dependent case to
4300  // just map FieldDecls, rather than requiring the rebuilder to look for
4301  // the fields again. However, __builtin_offsetof is rare enough in
4302  // template code that we don't care.
4303  bool ExprChanged = false;
4304  typedef Action::OffsetOfComponent Component;
4305  typedef OffsetOfExpr::OffsetOfNode Node;
4306  llvm::SmallVector<Component, 4> Components;
4307  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4308    const Node &ON = E->getComponent(I);
4309    Component Comp;
4310    Comp.isBrackets = true;
4311    Comp.LocStart = ON.getRange().getBegin();
4312    Comp.LocEnd = ON.getRange().getEnd();
4313    switch (ON.getKind()) {
4314    case Node::Array: {
4315      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
4316      OwningExprResult Index = getDerived().TransformExpr(FromIndex);
4317      if (Index.isInvalid())
4318        return getSema().ExprError();
4319
4320      ExprChanged = ExprChanged || Index.get() != FromIndex;
4321      Comp.isBrackets = true;
4322      Comp.U.E = Index.takeAs<Expr>(); // FIXME: leaked
4323      break;
4324    }
4325
4326    case Node::Field:
4327    case Node::Identifier:
4328      Comp.isBrackets = false;
4329      Comp.U.IdentInfo = ON.getFieldName();
4330      if (!Comp.U.IdentInfo)
4331        continue;
4332
4333      break;
4334
4335    case Node::Base:
4336      // Will be recomputed during the rebuild.
4337      continue;
4338    }
4339
4340    Components.push_back(Comp);
4341  }
4342
4343  // If nothing changed, retain the existing expression.
4344  if (!getDerived().AlwaysRebuild() &&
4345      Type == E->getTypeSourceInfo() &&
4346      !ExprChanged)
4347    return SemaRef.Owned(E->Retain());
4348
4349  // Build a new offsetof expression.
4350  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
4351                                          Components.data(), Components.size(),
4352                                          E->getRParenLoc());
4353}
4354
4355template<typename Derived>
4356Sema::OwningExprResult
4357TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4358  if (E->isArgumentType()) {
4359    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
4360
4361    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
4362    if (!NewT)
4363      return SemaRef.ExprError();
4364
4365    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4366      return SemaRef.Owned(E->Retain());
4367
4368    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
4369                                             E->isSizeOf(),
4370                                             E->getSourceRange());
4371  }
4372
4373  Sema::OwningExprResult SubExpr(SemaRef);
4374  {
4375    // C++0x [expr.sizeof]p1:
4376    //   The operand is either an expression, which is an unevaluated operand
4377    //   [...]
4378    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
4379
4380    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4381    if (SubExpr.isInvalid())
4382      return SemaRef.ExprError();
4383
4384    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4385      return SemaRef.Owned(E->Retain());
4386  }
4387
4388  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
4389                                           E->isSizeOf(),
4390                                           E->getSourceRange());
4391}
4392
4393template<typename Derived>
4394Sema::OwningExprResult
4395TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
4396  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4397  if (LHS.isInvalid())
4398    return SemaRef.ExprError();
4399
4400  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4401  if (RHS.isInvalid())
4402    return SemaRef.ExprError();
4403
4404
4405  if (!getDerived().AlwaysRebuild() &&
4406      LHS.get() == E->getLHS() &&
4407      RHS.get() == E->getRHS())
4408    return SemaRef.Owned(E->Retain());
4409
4410  return getDerived().RebuildArraySubscriptExpr(move(LHS),
4411                                           /*FIXME:*/E->getLHS()->getLocStart(),
4412                                                move(RHS),
4413                                                E->getRBracketLoc());
4414}
4415
4416template<typename Derived>
4417Sema::OwningExprResult
4418TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4419  // Transform the callee.
4420  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4421  if (Callee.isInvalid())
4422    return SemaRef.ExprError();
4423
4424  // Transform arguments.
4425  bool ArgChanged = false;
4426  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4427  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4428  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
4429    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4430    if (Arg.isInvalid())
4431      return SemaRef.ExprError();
4432
4433    // FIXME: Wrong source location information for the ','.
4434    FakeCommaLocs.push_back(
4435       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
4436
4437    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
4438    Args.push_back(Arg.takeAs<Expr>());
4439  }
4440
4441  if (!getDerived().AlwaysRebuild() &&
4442      Callee.get() == E->getCallee() &&
4443      !ArgChanged)
4444    return SemaRef.Owned(E->Retain());
4445
4446  // FIXME: Wrong source location information for the '('.
4447  SourceLocation FakeLParenLoc
4448    = ((Expr *)Callee.get())->getSourceRange().getBegin();
4449  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
4450                                      move_arg(Args),
4451                                      FakeCommaLocs.data(),
4452                                      E->getRParenLoc());
4453}
4454
4455template<typename Derived>
4456Sema::OwningExprResult
4457TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
4458  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4459  if (Base.isInvalid())
4460    return SemaRef.ExprError();
4461
4462  NestedNameSpecifier *Qualifier = 0;
4463  if (E->hasQualifier()) {
4464    Qualifier
4465      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4466                                                  E->getQualifierRange());
4467    if (Qualifier == 0)
4468      return SemaRef.ExprError();
4469  }
4470
4471  ValueDecl *Member
4472    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
4473                                                         E->getMemberDecl()));
4474  if (!Member)
4475    return SemaRef.ExprError();
4476
4477  NamedDecl *FoundDecl = E->getFoundDecl();
4478  if (FoundDecl == E->getMemberDecl()) {
4479    FoundDecl = Member;
4480  } else {
4481    FoundDecl = cast_or_null<NamedDecl>(
4482                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
4483    if (!FoundDecl)
4484      return SemaRef.ExprError();
4485  }
4486
4487  if (!getDerived().AlwaysRebuild() &&
4488      Base.get() == E->getBase() &&
4489      Qualifier == E->getQualifier() &&
4490      Member == E->getMemberDecl() &&
4491      FoundDecl == E->getFoundDecl() &&
4492      !E->hasExplicitTemplateArgumentList()) {
4493
4494    // Mark it referenced in the new context regardless.
4495    // FIXME: this is a bit instantiation-specific.
4496    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
4497    return SemaRef.Owned(E->Retain());
4498  }
4499
4500  TemplateArgumentListInfo TransArgs;
4501  if (E->hasExplicitTemplateArgumentList()) {
4502    TransArgs.setLAngleLoc(E->getLAngleLoc());
4503    TransArgs.setRAngleLoc(E->getRAngleLoc());
4504    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4505      TemplateArgumentLoc Loc;
4506      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4507        return SemaRef.ExprError();
4508      TransArgs.addArgument(Loc);
4509    }
4510  }
4511
4512  // FIXME: Bogus source location for the operator
4513  SourceLocation FakeOperatorLoc
4514    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4515
4516  // FIXME: to do this check properly, we will need to preserve the
4517  // first-qualifier-in-scope here, just in case we had a dependent
4518  // base (and therefore couldn't do the check) and a
4519  // nested-name-qualifier (and therefore could do the lookup).
4520  NamedDecl *FirstQualifierInScope = 0;
4521
4522  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
4523                                        E->isArrow(),
4524                                        Qualifier,
4525                                        E->getQualifierRange(),
4526                                        E->getMemberLoc(),
4527                                        Member,
4528                                        FoundDecl,
4529                                        (E->hasExplicitTemplateArgumentList()
4530                                           ? &TransArgs : 0),
4531                                        FirstQualifierInScope);
4532}
4533
4534template<typename Derived>
4535Sema::OwningExprResult
4536TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
4537  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4538  if (LHS.isInvalid())
4539    return SemaRef.ExprError();
4540
4541  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4542  if (RHS.isInvalid())
4543    return SemaRef.ExprError();
4544
4545  if (!getDerived().AlwaysRebuild() &&
4546      LHS.get() == E->getLHS() &&
4547      RHS.get() == E->getRHS())
4548    return SemaRef.Owned(E->Retain());
4549
4550  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
4551                                            move(LHS), move(RHS));
4552}
4553
4554template<typename Derived>
4555Sema::OwningExprResult
4556TreeTransform<Derived>::TransformCompoundAssignOperator(
4557                                                      CompoundAssignOperator *E) {
4558  return getDerived().TransformBinaryOperator(E);
4559}
4560
4561template<typename Derived>
4562Sema::OwningExprResult
4563TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
4564  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4565  if (Cond.isInvalid())
4566    return SemaRef.ExprError();
4567
4568  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4569  if (LHS.isInvalid())
4570    return SemaRef.ExprError();
4571
4572  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4573  if (RHS.isInvalid())
4574    return SemaRef.ExprError();
4575
4576  if (!getDerived().AlwaysRebuild() &&
4577      Cond.get() == E->getCond() &&
4578      LHS.get() == E->getLHS() &&
4579      RHS.get() == E->getRHS())
4580    return SemaRef.Owned(E->Retain());
4581
4582  return getDerived().RebuildConditionalOperator(move(Cond),
4583                                                 E->getQuestionLoc(),
4584                                                 move(LHS),
4585                                                 E->getColonLoc(),
4586                                                 move(RHS));
4587}
4588
4589template<typename Derived>
4590Sema::OwningExprResult
4591TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4592  // Implicit casts are eliminated during transformation, since they
4593  // will be recomputed by semantic analysis after transformation.
4594  return getDerived().TransformExpr(E->getSubExprAsWritten());
4595}
4596
4597template<typename Derived>
4598Sema::OwningExprResult
4599TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
4600  TypeSourceInfo *OldT;
4601  TypeSourceInfo *NewT;
4602  {
4603    // FIXME: Source location isn't quite accurate.
4604    SourceLocation TypeStartLoc
4605      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4606    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
4607
4608    OldT = E->getTypeInfoAsWritten();
4609    NewT = getDerived().TransformType(OldT);
4610    if (!NewT)
4611      return SemaRef.ExprError();
4612  }
4613
4614  OwningExprResult SubExpr
4615    = getDerived().TransformExpr(E->getSubExprAsWritten());
4616  if (SubExpr.isInvalid())
4617    return SemaRef.ExprError();
4618
4619  if (!getDerived().AlwaysRebuild() &&
4620      OldT == NewT &&
4621      SubExpr.get() == E->getSubExpr())
4622    return SemaRef.Owned(E->Retain());
4623
4624  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
4625                                            NewT,
4626                                            E->getRParenLoc(),
4627                                            move(SubExpr));
4628}
4629
4630template<typename Derived>
4631Sema::OwningExprResult
4632TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
4633  TypeSourceInfo *OldT = E->getTypeSourceInfo();
4634  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
4635  if (!NewT)
4636    return SemaRef.ExprError();
4637
4638  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4639  if (Init.isInvalid())
4640    return SemaRef.ExprError();
4641
4642  if (!getDerived().AlwaysRebuild() &&
4643      OldT == NewT &&
4644      Init.get() == E->getInitializer())
4645    return SemaRef.Owned(E->Retain());
4646
4647  // Note: the expression type doesn't necessarily match the
4648  // type-as-written, but that's okay, because it should always be
4649  // derivable from the initializer.
4650
4651  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4652                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
4653                                                 move(Init));
4654}
4655
4656template<typename Derived>
4657Sema::OwningExprResult
4658TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4659  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4660  if (Base.isInvalid())
4661    return SemaRef.ExprError();
4662
4663  if (!getDerived().AlwaysRebuild() &&
4664      Base.get() == E->getBase())
4665    return SemaRef.Owned(E->Retain());
4666
4667  // FIXME: Bad source location
4668  SourceLocation FakeOperatorLoc
4669    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
4670  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
4671                                                  E->getAccessorLoc(),
4672                                                  E->getAccessor());
4673}
4674
4675template<typename Derived>
4676Sema::OwningExprResult
4677TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4678  bool InitChanged = false;
4679
4680  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4681  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4682    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4683    if (Init.isInvalid())
4684      return SemaRef.ExprError();
4685
4686    InitChanged = InitChanged || Init.get() != E->getInit(I);
4687    Inits.push_back(Init.takeAs<Expr>());
4688  }
4689
4690  if (!getDerived().AlwaysRebuild() && !InitChanged)
4691    return SemaRef.Owned(E->Retain());
4692
4693  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4694                                      E->getRBraceLoc(), E->getType());
4695}
4696
4697template<typename Derived>
4698Sema::OwningExprResult
4699TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4700  Designation Desig;
4701
4702  // transform the initializer value
4703  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4704  if (Init.isInvalid())
4705    return SemaRef.ExprError();
4706
4707  // transform the designators.
4708  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
4709  bool ExprChanged = false;
4710  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4711                                             DEnd = E->designators_end();
4712       D != DEnd; ++D) {
4713    if (D->isFieldDesignator()) {
4714      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4715                                               D->getDotLoc(),
4716                                               D->getFieldLoc()));
4717      continue;
4718    }
4719
4720    if (D->isArrayDesignator()) {
4721      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4722      if (Index.isInvalid())
4723        return SemaRef.ExprError();
4724
4725      Desig.AddDesignator(Designator::getArray(Index.get(),
4726                                               D->getLBracketLoc()));
4727
4728      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4729      ArrayExprs.push_back(Index.release());
4730      continue;
4731    }
4732
4733    assert(D->isArrayRangeDesignator() && "New kind of designator?");
4734    OwningExprResult Start
4735      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4736    if (Start.isInvalid())
4737      return SemaRef.ExprError();
4738
4739    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4740    if (End.isInvalid())
4741      return SemaRef.ExprError();
4742
4743    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4744                                                  End.get(),
4745                                                  D->getLBracketLoc(),
4746                                                  D->getEllipsisLoc()));
4747
4748    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4749      End.get() != E->getArrayRangeEnd(*D);
4750
4751    ArrayExprs.push_back(Start.release());
4752    ArrayExprs.push_back(End.release());
4753  }
4754
4755  if (!getDerived().AlwaysRebuild() &&
4756      Init.get() == E->getInit() &&
4757      !ExprChanged)
4758    return SemaRef.Owned(E->Retain());
4759
4760  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4761                                                E->getEqualOrColonLoc(),
4762                                                E->usesGNUSyntax(), move(Init));
4763}
4764
4765template<typename Derived>
4766Sema::OwningExprResult
4767TreeTransform<Derived>::TransformImplicitValueInitExpr(
4768                                                     ImplicitValueInitExpr *E) {
4769  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4770
4771  // FIXME: Will we ever have proper type location here? Will we actually
4772  // need to transform the type?
4773  QualType T = getDerived().TransformType(E->getType());
4774  if (T.isNull())
4775    return SemaRef.ExprError();
4776
4777  if (!getDerived().AlwaysRebuild() &&
4778      T == E->getType())
4779    return SemaRef.Owned(E->Retain());
4780
4781  return getDerived().RebuildImplicitValueInitExpr(T);
4782}
4783
4784template<typename Derived>
4785Sema::OwningExprResult
4786TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4787  // FIXME: Do we want the type as written?
4788  QualType T;
4789
4790  {
4791    // FIXME: Source location isn't quite accurate.
4792    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4793    T = getDerived().TransformType(E->getType());
4794    if (T.isNull())
4795      return SemaRef.ExprError();
4796  }
4797
4798  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4799  if (SubExpr.isInvalid())
4800    return SemaRef.ExprError();
4801
4802  if (!getDerived().AlwaysRebuild() &&
4803      T == E->getType() &&
4804      SubExpr.get() == E->getSubExpr())
4805    return SemaRef.Owned(E->Retain());
4806
4807  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4808                                       T, E->getRParenLoc());
4809}
4810
4811template<typename Derived>
4812Sema::OwningExprResult
4813TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4814  bool ArgumentChanged = false;
4815  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4816  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4817    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4818    if (Init.isInvalid())
4819      return SemaRef.ExprError();
4820
4821    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4822    Inits.push_back(Init.takeAs<Expr>());
4823  }
4824
4825  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4826                                           move_arg(Inits),
4827                                           E->getRParenLoc());
4828}
4829
4830/// \brief Transform an address-of-label expression.
4831///
4832/// By default, the transformation of an address-of-label expression always
4833/// rebuilds the expression, so that the label identifier can be resolved to
4834/// the corresponding label statement by semantic analysis.
4835template<typename Derived>
4836Sema::OwningExprResult
4837TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4838  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4839                                           E->getLabel());
4840}
4841
4842template<typename Derived>
4843Sema::OwningExprResult
4844TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
4845  OwningStmtResult SubStmt
4846    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4847  if (SubStmt.isInvalid())
4848    return SemaRef.ExprError();
4849
4850  if (!getDerived().AlwaysRebuild() &&
4851      SubStmt.get() == E->getSubStmt())
4852    return SemaRef.Owned(E->Retain());
4853
4854  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4855                                      move(SubStmt),
4856                                      E->getRParenLoc());
4857}
4858
4859template<typename Derived>
4860Sema::OwningExprResult
4861TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4862  QualType T1, T2;
4863  {
4864    // FIXME: Source location isn't quite accurate.
4865    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4866
4867    T1 = getDerived().TransformType(E->getArgType1());
4868    if (T1.isNull())
4869      return SemaRef.ExprError();
4870
4871    T2 = getDerived().TransformType(E->getArgType2());
4872    if (T2.isNull())
4873      return SemaRef.ExprError();
4874  }
4875
4876  if (!getDerived().AlwaysRebuild() &&
4877      T1 == E->getArgType1() &&
4878      T2 == E->getArgType2())
4879    return SemaRef.Owned(E->Retain());
4880
4881  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4882                                                 T1, T2, E->getRParenLoc());
4883}
4884
4885template<typename Derived>
4886Sema::OwningExprResult
4887TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4888  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4889  if (Cond.isInvalid())
4890    return SemaRef.ExprError();
4891
4892  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4893  if (LHS.isInvalid())
4894    return SemaRef.ExprError();
4895
4896  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4897  if (RHS.isInvalid())
4898    return SemaRef.ExprError();
4899
4900  if (!getDerived().AlwaysRebuild() &&
4901      Cond.get() == E->getCond() &&
4902      LHS.get() == E->getLHS() &&
4903      RHS.get() == E->getRHS())
4904    return SemaRef.Owned(E->Retain());
4905
4906  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4907                                        move(Cond), move(LHS), move(RHS),
4908                                        E->getRParenLoc());
4909}
4910
4911template<typename Derived>
4912Sema::OwningExprResult
4913TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
4914  return SemaRef.Owned(E->Retain());
4915}
4916
4917template<typename Derived>
4918Sema::OwningExprResult
4919TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4920  switch (E->getOperator()) {
4921  case OO_New:
4922  case OO_Delete:
4923  case OO_Array_New:
4924  case OO_Array_Delete:
4925    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4926    return SemaRef.ExprError();
4927
4928  case OO_Call: {
4929    // This is a call to an object's operator().
4930    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4931
4932    // Transform the object itself.
4933    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4934    if (Object.isInvalid())
4935      return SemaRef.ExprError();
4936
4937    // FIXME: Poor location information
4938    SourceLocation FakeLParenLoc
4939      = SemaRef.PP.getLocForEndOfToken(
4940                              static_cast<Expr *>(Object.get())->getLocEnd());
4941
4942    // Transform the call arguments.
4943    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4944    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4945    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
4946      if (getDerived().DropCallArgument(E->getArg(I)))
4947        break;
4948
4949      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4950      if (Arg.isInvalid())
4951        return SemaRef.ExprError();
4952
4953      // FIXME: Poor source location information.
4954      SourceLocation FakeCommaLoc
4955        = SemaRef.PP.getLocForEndOfToken(
4956                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4957      FakeCommaLocs.push_back(FakeCommaLoc);
4958      Args.push_back(Arg.release());
4959    }
4960
4961    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4962                                        move_arg(Args),
4963                                        FakeCommaLocs.data(),
4964                                        E->getLocEnd());
4965  }
4966
4967#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4968  case OO_##Name:
4969#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4970#include "clang/Basic/OperatorKinds.def"
4971  case OO_Subscript:
4972    // Handled below.
4973    break;
4974
4975  case OO_Conditional:
4976    llvm_unreachable("conditional operator is not actually overloadable");
4977    return SemaRef.ExprError();
4978
4979  case OO_None:
4980  case NUM_OVERLOADED_OPERATORS:
4981    llvm_unreachable("not an overloaded operator?");
4982    return SemaRef.ExprError();
4983  }
4984
4985  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4986  if (Callee.isInvalid())
4987    return SemaRef.ExprError();
4988
4989  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4990  if (First.isInvalid())
4991    return SemaRef.ExprError();
4992
4993  OwningExprResult Second(SemaRef);
4994  if (E->getNumArgs() == 2) {
4995    Second = getDerived().TransformExpr(E->getArg(1));
4996    if (Second.isInvalid())
4997      return SemaRef.ExprError();
4998  }
4999
5000  if (!getDerived().AlwaysRebuild() &&
5001      Callee.get() == E->getCallee() &&
5002      First.get() == E->getArg(0) &&
5003      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
5004    return SemaRef.Owned(E->Retain());
5005
5006  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
5007                                                 E->getOperatorLoc(),
5008                                                 move(Callee),
5009                                                 move(First),
5010                                                 move(Second));
5011}
5012
5013template<typename Derived>
5014Sema::OwningExprResult
5015TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
5016  return getDerived().TransformCallExpr(E);
5017}
5018
5019template<typename Derived>
5020Sema::OwningExprResult
5021TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
5022  TypeSourceInfo *OldT;
5023  TypeSourceInfo *NewT;
5024  {
5025    // FIXME: Source location isn't quite accurate.
5026    SourceLocation TypeStartLoc
5027      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5028    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
5029
5030    OldT = E->getTypeInfoAsWritten();
5031    NewT = getDerived().TransformType(OldT);
5032    if (!NewT)
5033      return SemaRef.ExprError();
5034  }
5035
5036  OwningExprResult SubExpr
5037    = getDerived().TransformExpr(E->getSubExprAsWritten());
5038  if (SubExpr.isInvalid())
5039    return SemaRef.ExprError();
5040
5041  if (!getDerived().AlwaysRebuild() &&
5042      OldT == NewT &&
5043      SubExpr.get() == E->getSubExpr())
5044    return SemaRef.Owned(E->Retain());
5045
5046  // FIXME: Poor source location information here.
5047  SourceLocation FakeLAngleLoc
5048    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5049  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
5050  SourceLocation FakeRParenLoc
5051    = SemaRef.PP.getLocForEndOfToken(
5052                                  E->getSubExpr()->getSourceRange().getEnd());
5053  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
5054                                              E->getStmtClass(),
5055                                              FakeLAngleLoc,
5056                                              NewT,
5057                                              FakeRAngleLoc,
5058                                              FakeRAngleLoc,
5059                                              move(SubExpr),
5060                                              FakeRParenLoc);
5061}
5062
5063template<typename Derived>
5064Sema::OwningExprResult
5065TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5066  return getDerived().TransformCXXNamedCastExpr(E);
5067}
5068
5069template<typename Derived>
5070Sema::OwningExprResult
5071TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5072  return getDerived().TransformCXXNamedCastExpr(E);
5073}
5074
5075template<typename Derived>
5076Sema::OwningExprResult
5077TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5078                                                      CXXReinterpretCastExpr *E) {
5079  return getDerived().TransformCXXNamedCastExpr(E);
5080}
5081
5082template<typename Derived>
5083Sema::OwningExprResult
5084TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5085  return getDerived().TransformCXXNamedCastExpr(E);
5086}
5087
5088template<typename Derived>
5089Sema::OwningExprResult
5090TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5091                                                     CXXFunctionalCastExpr *E) {
5092  TypeSourceInfo *OldT;
5093  TypeSourceInfo *NewT;
5094  {
5095    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5096
5097    OldT = E->getTypeInfoAsWritten();
5098    NewT = getDerived().TransformType(OldT);
5099    if (!NewT)
5100      return SemaRef.ExprError();
5101  }
5102
5103  OwningExprResult SubExpr
5104    = getDerived().TransformExpr(E->getSubExprAsWritten());
5105  if (SubExpr.isInvalid())
5106    return SemaRef.ExprError();
5107
5108  if (!getDerived().AlwaysRebuild() &&
5109      OldT == NewT &&
5110      SubExpr.get() == E->getSubExpr())
5111    return SemaRef.Owned(E->Retain());
5112
5113  // FIXME: The end of the type's source range is wrong
5114  return getDerived().RebuildCXXFunctionalCastExpr(
5115                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
5116                                                   NewT,
5117                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
5118                                                   move(SubExpr),
5119                                                   E->getRParenLoc());
5120}
5121
5122template<typename Derived>
5123Sema::OwningExprResult
5124TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5125  if (E->isTypeOperand()) {
5126    TypeSourceInfo *TInfo
5127      = getDerived().TransformType(E->getTypeOperandSourceInfo());
5128    if (!TInfo)
5129      return SemaRef.ExprError();
5130
5131    if (!getDerived().AlwaysRebuild() &&
5132        TInfo == E->getTypeOperandSourceInfo())
5133      return SemaRef.Owned(E->Retain());
5134
5135    return getDerived().RebuildCXXTypeidExpr(E->getType(),
5136                                             E->getLocStart(),
5137                                             TInfo,
5138                                             E->getLocEnd());
5139  }
5140
5141  // We don't know whether the expression is potentially evaluated until
5142  // after we perform semantic analysis, so the expression is potentially
5143  // potentially evaluated.
5144  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5145                                      Action::PotentiallyPotentiallyEvaluated);
5146
5147  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5148  if (SubExpr.isInvalid())
5149    return SemaRef.ExprError();
5150
5151  if (!getDerived().AlwaysRebuild() &&
5152      SubExpr.get() == E->getExprOperand())
5153    return SemaRef.Owned(E->Retain());
5154
5155  return getDerived().RebuildCXXTypeidExpr(E->getType(),
5156                                           E->getLocStart(),
5157                                           move(SubExpr),
5158                                           E->getLocEnd());
5159}
5160
5161template<typename Derived>
5162Sema::OwningExprResult
5163TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
5164  return SemaRef.Owned(E->Retain());
5165}
5166
5167template<typename Derived>
5168Sema::OwningExprResult
5169TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5170                                                     CXXNullPtrLiteralExpr *E) {
5171  return SemaRef.Owned(E->Retain());
5172}
5173
5174template<typename Derived>
5175Sema::OwningExprResult
5176TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5177  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5178
5179  QualType T = getDerived().TransformType(E->getType());
5180  if (T.isNull())
5181    return SemaRef.ExprError();
5182
5183  if (!getDerived().AlwaysRebuild() &&
5184      T == E->getType())
5185    return SemaRef.Owned(E->Retain());
5186
5187  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5188}
5189
5190template<typename Derived>
5191Sema::OwningExprResult
5192TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
5193  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5194  if (SubExpr.isInvalid())
5195    return SemaRef.ExprError();
5196
5197  if (!getDerived().AlwaysRebuild() &&
5198      SubExpr.get() == E->getSubExpr())
5199    return SemaRef.Owned(E->Retain());
5200
5201  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
5202}
5203
5204template<typename Derived>
5205Sema::OwningExprResult
5206TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
5207  ParmVarDecl *Param
5208    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
5209                                                           E->getParam()));
5210  if (!Param)
5211    return SemaRef.ExprError();
5212
5213  if (!getDerived().AlwaysRebuild() &&
5214      Param == E->getParam())
5215    return SemaRef.Owned(E->Retain());
5216
5217  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5218}
5219
5220template<typename Derived>
5221Sema::OwningExprResult
5222TreeTransform<Derived>::TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
5223  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5224
5225  QualType T = getDerived().TransformType(E->getType());
5226  if (T.isNull())
5227    return SemaRef.ExprError();
5228
5229  if (!getDerived().AlwaysRebuild() &&
5230      T == E->getType())
5231    return SemaRef.Owned(E->Retain());
5232
5233  return getDerived().RebuildCXXScalarValueInitExpr(E->getTypeBeginLoc(),
5234                                                 /*FIXME:*/E->getTypeBeginLoc(),
5235                                                    T,
5236                                                    E->getRParenLoc());
5237}
5238
5239template<typename Derived>
5240Sema::OwningExprResult
5241TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5242  // Transform the type that we're allocating
5243  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5244  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5245  if (AllocType.isNull())
5246    return SemaRef.ExprError();
5247
5248  // Transform the size of the array we're allocating (if any).
5249  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5250  if (ArraySize.isInvalid())
5251    return SemaRef.ExprError();
5252
5253  // Transform the placement arguments (if any).
5254  bool ArgumentChanged = false;
5255  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
5256  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
5257    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5258    if (Arg.isInvalid())
5259      return SemaRef.ExprError();
5260
5261    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5262    PlacementArgs.push_back(Arg.take());
5263  }
5264
5265  // transform the constructor arguments (if any).
5266  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
5267  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5268    if (getDerived().DropCallArgument(E->getConstructorArg(I)))
5269      break;
5270
5271    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5272    if (Arg.isInvalid())
5273      return SemaRef.ExprError();
5274
5275    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5276    ConstructorArgs.push_back(Arg.take());
5277  }
5278
5279  // Transform constructor, new operator, and delete operator.
5280  CXXConstructorDecl *Constructor = 0;
5281  if (E->getConstructor()) {
5282    Constructor = cast_or_null<CXXConstructorDecl>(
5283                                   getDerived().TransformDecl(E->getLocStart(),
5284                                                         E->getConstructor()));
5285    if (!Constructor)
5286      return SemaRef.ExprError();
5287  }
5288
5289  FunctionDecl *OperatorNew = 0;
5290  if (E->getOperatorNew()) {
5291    OperatorNew = cast_or_null<FunctionDecl>(
5292                                 getDerived().TransformDecl(E->getLocStart(),
5293                                                         E->getOperatorNew()));
5294    if (!OperatorNew)
5295      return SemaRef.ExprError();
5296  }
5297
5298  FunctionDecl *OperatorDelete = 0;
5299  if (E->getOperatorDelete()) {
5300    OperatorDelete = cast_or_null<FunctionDecl>(
5301                                   getDerived().TransformDecl(E->getLocStart(),
5302                                                       E->getOperatorDelete()));
5303    if (!OperatorDelete)
5304      return SemaRef.ExprError();
5305  }
5306
5307  if (!getDerived().AlwaysRebuild() &&
5308      AllocType == E->getAllocatedType() &&
5309      ArraySize.get() == E->getArraySize() &&
5310      Constructor == E->getConstructor() &&
5311      OperatorNew == E->getOperatorNew() &&
5312      OperatorDelete == E->getOperatorDelete() &&
5313      !ArgumentChanged) {
5314    // Mark any declarations we need as referenced.
5315    // FIXME: instantiation-specific.
5316    if (Constructor)
5317      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5318    if (OperatorNew)
5319      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
5320    if (OperatorDelete)
5321      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
5322    return SemaRef.Owned(E->Retain());
5323  }
5324
5325  if (!ArraySize.get()) {
5326    // If no array size was specified, but the new expression was
5327    // instantiated with an array type (e.g., "new T" where T is
5328    // instantiated with "int[4]"), extract the outer bound from the
5329    // array type as our array size. We do this with constant and
5330    // dependently-sized array types.
5331    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
5332    if (!ArrayT) {
5333      // Do nothing
5334    } else if (const ConstantArrayType *ConsArrayT
5335                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5336      ArraySize
5337        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5338                                                  ConsArrayT->getSize(),
5339                                                  SemaRef.Context.getSizeType(),
5340                                                  /*FIXME:*/E->getLocStart()));
5341      AllocType = ConsArrayT->getElementType();
5342    } else if (const DependentSizedArrayType *DepArrayT
5343                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
5344      if (DepArrayT->getSizeExpr()) {
5345        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
5346        AllocType = DepArrayT->getElementType();
5347      }
5348    }
5349  }
5350  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5351                                        E->isGlobalNew(),
5352                                        /*FIXME:*/E->getLocStart(),
5353                                        move_arg(PlacementArgs),
5354                                        /*FIXME:*/E->getLocStart(),
5355                                        E->isParenTypeId(),
5356                                        AllocType,
5357                                        /*FIXME:*/E->getLocStart(),
5358                                        /*FIXME:*/SourceRange(),
5359                                        move(ArraySize),
5360                                        /*FIXME:*/E->getLocStart(),
5361                                        move_arg(ConstructorArgs),
5362                                        E->getLocEnd());
5363}
5364
5365template<typename Derived>
5366Sema::OwningExprResult
5367TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
5368  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
5369  if (Operand.isInvalid())
5370    return SemaRef.ExprError();
5371
5372  // Transform the delete operator, if known.
5373  FunctionDecl *OperatorDelete = 0;
5374  if (E->getOperatorDelete()) {
5375    OperatorDelete = cast_or_null<FunctionDecl>(
5376                                   getDerived().TransformDecl(E->getLocStart(),
5377                                                       E->getOperatorDelete()));
5378    if (!OperatorDelete)
5379      return SemaRef.ExprError();
5380  }
5381
5382  if (!getDerived().AlwaysRebuild() &&
5383      Operand.get() == E->getArgument() &&
5384      OperatorDelete == E->getOperatorDelete()) {
5385    // Mark any declarations we need as referenced.
5386    // FIXME: instantiation-specific.
5387    if (OperatorDelete)
5388      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
5389    return SemaRef.Owned(E->Retain());
5390  }
5391
5392  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5393                                           E->isGlobalDelete(),
5394                                           E->isArrayForm(),
5395                                           move(Operand));
5396}
5397
5398template<typename Derived>
5399Sema::OwningExprResult
5400TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5401                                                     CXXPseudoDestructorExpr *E) {
5402  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
5403  if (Base.isInvalid())
5404    return SemaRef.ExprError();
5405
5406  Sema::TypeTy *ObjectTypePtr = 0;
5407  bool MayBePseudoDestructor = false;
5408  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5409                                              E->getOperatorLoc(),
5410                                        E->isArrow()? tok::arrow : tok::period,
5411                                              ObjectTypePtr,
5412                                              MayBePseudoDestructor);
5413  if (Base.isInvalid())
5414    return SemaRef.ExprError();
5415
5416  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
5417  NestedNameSpecifier *Qualifier
5418    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5419                                                E->getQualifierRange(),
5420                                                ObjectType);
5421  if (E->getQualifier() && !Qualifier)
5422    return SemaRef.ExprError();
5423
5424  PseudoDestructorTypeStorage Destroyed;
5425  if (E->getDestroyedTypeInfo()) {
5426    TypeSourceInfo *DestroyedTypeInfo
5427      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5428    if (!DestroyedTypeInfo)
5429      return SemaRef.ExprError();
5430    Destroyed = DestroyedTypeInfo;
5431  } else if (ObjectType->isDependentType()) {
5432    // We aren't likely to be able to resolve the identifier down to a type
5433    // now anyway, so just retain the identifier.
5434    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5435                                            E->getDestroyedTypeLoc());
5436  } else {
5437    // Look for a destructor known with the given name.
5438    CXXScopeSpec SS;
5439    if (Qualifier) {
5440      SS.setScopeRep(Qualifier);
5441      SS.setRange(E->getQualifierRange());
5442    }
5443
5444    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
5445                                              *E->getDestroyedTypeIdentifier(),
5446                                                E->getDestroyedTypeLoc(),
5447                                                /*Scope=*/0,
5448                                                SS, ObjectTypePtr,
5449                                                false);
5450    if (!T)
5451      return SemaRef.ExprError();
5452
5453    Destroyed
5454      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5455                                                 E->getDestroyedTypeLoc());
5456  }
5457
5458  TypeSourceInfo *ScopeTypeInfo = 0;
5459  if (E->getScopeTypeInfo()) {
5460    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5461                                               ObjectType);
5462    if (!ScopeTypeInfo)
5463      return SemaRef.ExprError();
5464  }
5465
5466  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
5467                                                     E->getOperatorLoc(),
5468                                                     E->isArrow(),
5469                                                     Qualifier,
5470                                                     E->getQualifierRange(),
5471                                                     ScopeTypeInfo,
5472                                                     E->getColonColonLoc(),
5473                                                     E->getTildeLoc(),
5474                                                     Destroyed);
5475}
5476
5477template<typename Derived>
5478Sema::OwningExprResult
5479TreeTransform<Derived>::TransformUnresolvedLookupExpr(
5480                                                  UnresolvedLookupExpr *Old) {
5481  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5482
5483  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5484                 Sema::LookupOrdinaryName);
5485
5486  // Transform all the decls.
5487  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5488         E = Old->decls_end(); I != E; ++I) {
5489    NamedDecl *InstD = static_cast<NamedDecl*>(
5490                                 getDerived().TransformDecl(Old->getNameLoc(),
5491                                                            *I));
5492    if (!InstD) {
5493      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
5494      // This can happen because of dependent hiding.
5495      if (isa<UsingShadowDecl>(*I))
5496        continue;
5497      else
5498        return SemaRef.ExprError();
5499    }
5500
5501    // Expand using declarations.
5502    if (isa<UsingDecl>(InstD)) {
5503      UsingDecl *UD = cast<UsingDecl>(InstD);
5504      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5505             E = UD->shadow_end(); I != E; ++I)
5506        R.addDecl(*I);
5507      continue;
5508    }
5509
5510    R.addDecl(InstD);
5511  }
5512
5513  // Resolve a kind, but don't do any further analysis.  If it's
5514  // ambiguous, the callee needs to deal with it.
5515  R.resolveKind();
5516
5517  // Rebuild the nested-name qualifier, if present.
5518  CXXScopeSpec SS;
5519  NestedNameSpecifier *Qualifier = 0;
5520  if (Old->getQualifier()) {
5521    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5522                                                    Old->getQualifierRange());
5523    if (!Qualifier)
5524      return SemaRef.ExprError();
5525
5526    SS.setScopeRep(Qualifier);
5527    SS.setRange(Old->getQualifierRange());
5528  }
5529
5530  if (Old->getNamingClass()) {
5531    CXXRecordDecl *NamingClass
5532      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
5533                                                            Old->getNameLoc(),
5534                                                        Old->getNamingClass()));
5535    if (!NamingClass)
5536      return SemaRef.ExprError();
5537
5538    R.setNamingClass(NamingClass);
5539  }
5540
5541  // If we have no template arguments, it's a normal declaration name.
5542  if (!Old->hasExplicitTemplateArgs())
5543    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5544
5545  // If we have template arguments, rebuild them, then rebuild the
5546  // templateid expression.
5547  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5548  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5549    TemplateArgumentLoc Loc;
5550    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5551      return SemaRef.ExprError();
5552    TransArgs.addArgument(Loc);
5553  }
5554
5555  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5556                                            TransArgs);
5557}
5558
5559template<typename Derived>
5560Sema::OwningExprResult
5561TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5562  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5563
5564  QualType T = getDerived().TransformType(E->getQueriedType());
5565  if (T.isNull())
5566    return SemaRef.ExprError();
5567
5568  if (!getDerived().AlwaysRebuild() &&
5569      T == E->getQueriedType())
5570    return SemaRef.Owned(E->Retain());
5571
5572  // FIXME: Bad location information
5573  SourceLocation FakeLParenLoc
5574    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
5575
5576  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5577                                            E->getLocStart(),
5578                                            /*FIXME:*/FakeLParenLoc,
5579                                            T,
5580                                            E->getLocEnd());
5581}
5582
5583template<typename Derived>
5584Sema::OwningExprResult
5585TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
5586                                                  DependentScopeDeclRefExpr *E) {
5587  NestedNameSpecifier *NNS
5588    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5589                                                E->getQualifierRange());
5590  if (!NNS)
5591    return SemaRef.ExprError();
5592
5593  DeclarationName Name
5594    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
5595  if (!Name)
5596    return SemaRef.ExprError();
5597
5598  if (!E->hasExplicitTemplateArgs()) {
5599    if (!getDerived().AlwaysRebuild() &&
5600        NNS == E->getQualifier() &&
5601        Name == E->getDeclName())
5602      return SemaRef.Owned(E->Retain());
5603
5604    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5605                                                         E->getQualifierRange(),
5606                                                         Name, E->getLocation(),
5607                                                         /*TemplateArgs*/ 0);
5608  }
5609
5610  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5611  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5612    TemplateArgumentLoc Loc;
5613    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5614      return SemaRef.ExprError();
5615    TransArgs.addArgument(Loc);
5616  }
5617
5618  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5619                                                       E->getQualifierRange(),
5620                                                       Name, E->getLocation(),
5621                                                       &TransArgs);
5622}
5623
5624template<typename Derived>
5625Sema::OwningExprResult
5626TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5627  // CXXConstructExprs are always implicit, so when we have a
5628  // 1-argument construction we just transform that argument.
5629  if (E->getNumArgs() == 1 ||
5630      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5631    return getDerived().TransformExpr(E->getArg(0));
5632
5633  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5634
5635  QualType T = getDerived().TransformType(E->getType());
5636  if (T.isNull())
5637    return SemaRef.ExprError();
5638
5639  CXXConstructorDecl *Constructor
5640    = cast_or_null<CXXConstructorDecl>(
5641                                getDerived().TransformDecl(E->getLocStart(),
5642                                                         E->getConstructor()));
5643  if (!Constructor)
5644    return SemaRef.ExprError();
5645
5646  bool ArgumentChanged = false;
5647  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5648  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5649       ArgEnd = E->arg_end();
5650       Arg != ArgEnd; ++Arg) {
5651    if (getDerived().DropCallArgument(*Arg)) {
5652      ArgumentChanged = true;
5653      break;
5654    }
5655
5656    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5657    if (TransArg.isInvalid())
5658      return SemaRef.ExprError();
5659
5660    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5661    Args.push_back(TransArg.takeAs<Expr>());
5662  }
5663
5664  if (!getDerived().AlwaysRebuild() &&
5665      T == E->getType() &&
5666      Constructor == E->getConstructor() &&
5667      !ArgumentChanged) {
5668    // Mark the constructor as referenced.
5669    // FIXME: Instantiation-specific
5670    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5671    return SemaRef.Owned(E->Retain());
5672  }
5673
5674  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
5675                                              Constructor, E->isElidable(),
5676                                              move_arg(Args));
5677}
5678
5679/// \brief Transform a C++ temporary-binding expression.
5680///
5681/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
5682/// transform the subexpression and return that.
5683template<typename Derived>
5684Sema::OwningExprResult
5685TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
5686  return getDerived().TransformExpr(E->getSubExpr());
5687}
5688
5689/// \brief Transform a C++ reference-binding expression.
5690///
5691/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5692/// transform the subexpression and return that.
5693template<typename Derived>
5694Sema::OwningExprResult
5695TreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5696  return getDerived().TransformExpr(E->getSubExpr());
5697}
5698
5699/// \brief Transform a C++ expression that contains temporaries that should
5700/// be destroyed after the expression is evaluated.
5701///
5702/// Since CXXExprWithTemporaries nodes are implicitly generated, we
5703/// just transform the subexpression and return that.
5704template<typename Derived>
5705Sema::OwningExprResult
5706TreeTransform<Derived>::TransformCXXExprWithTemporaries(
5707                                                    CXXExprWithTemporaries *E) {
5708  return getDerived().TransformExpr(E->getSubExpr());
5709}
5710
5711template<typename Derived>
5712Sema::OwningExprResult
5713TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5714                                                      CXXTemporaryObjectExpr *E) {
5715  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5716  QualType T = getDerived().TransformType(E->getType());
5717  if (T.isNull())
5718    return SemaRef.ExprError();
5719
5720  CXXConstructorDecl *Constructor
5721    = cast_or_null<CXXConstructorDecl>(
5722                                  getDerived().TransformDecl(E->getLocStart(),
5723                                                         E->getConstructor()));
5724  if (!Constructor)
5725    return SemaRef.ExprError();
5726
5727  bool ArgumentChanged = false;
5728  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5729  Args.reserve(E->getNumArgs());
5730  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5731                                         ArgEnd = E->arg_end();
5732       Arg != ArgEnd; ++Arg) {
5733    if (getDerived().DropCallArgument(*Arg)) {
5734      ArgumentChanged = true;
5735      break;
5736    }
5737
5738    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5739    if (TransArg.isInvalid())
5740      return SemaRef.ExprError();
5741
5742    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5743    Args.push_back((Expr *)TransArg.release());
5744  }
5745
5746  if (!getDerived().AlwaysRebuild() &&
5747      T == E->getType() &&
5748      Constructor == E->getConstructor() &&
5749      !ArgumentChanged) {
5750    // FIXME: Instantiation-specific
5751    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5752    return SemaRef.MaybeBindToTemporary(E->Retain());
5753  }
5754
5755  // FIXME: Bogus location information
5756  SourceLocation CommaLoc;
5757  if (Args.size() > 1) {
5758    Expr *First = (Expr *)Args[0];
5759    CommaLoc
5760      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5761  }
5762  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5763                                                    T,
5764                                                /*FIXME:*/E->getTypeBeginLoc(),
5765                                                    move_arg(Args),
5766                                                    &CommaLoc,
5767                                                    E->getLocEnd());
5768}
5769
5770template<typename Derived>
5771Sema::OwningExprResult
5772TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5773                                                  CXXUnresolvedConstructExpr *E) {
5774  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5775  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5776  if (T.isNull())
5777    return SemaRef.ExprError();
5778
5779  bool ArgumentChanged = false;
5780  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5781  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5782  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5783                                             ArgEnd = E->arg_end();
5784       Arg != ArgEnd; ++Arg) {
5785    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5786    if (TransArg.isInvalid())
5787      return SemaRef.ExprError();
5788
5789    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5790    FakeCommaLocs.push_back(
5791                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
5792    Args.push_back(TransArg.takeAs<Expr>());
5793  }
5794
5795  if (!getDerived().AlwaysRebuild() &&
5796      T == E->getTypeAsWritten() &&
5797      !ArgumentChanged)
5798    return SemaRef.Owned(E->Retain());
5799
5800  // FIXME: we're faking the locations of the commas
5801  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5802                                                        T,
5803                                                        E->getLParenLoc(),
5804                                                        move_arg(Args),
5805                                                        FakeCommaLocs.data(),
5806                                                        E->getRParenLoc());
5807}
5808
5809template<typename Derived>
5810Sema::OwningExprResult
5811TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
5812                                                     CXXDependentScopeMemberExpr *E) {
5813  // Transform the base of the expression.
5814  OwningExprResult Base(SemaRef, (Expr*) 0);
5815  Expr *OldBase;
5816  QualType BaseType;
5817  QualType ObjectType;
5818  if (!E->isImplicitAccess()) {
5819    OldBase = E->getBase();
5820    Base = getDerived().TransformExpr(OldBase);
5821    if (Base.isInvalid())
5822      return SemaRef.ExprError();
5823
5824    // Start the member reference and compute the object's type.
5825    Sema::TypeTy *ObjectTy = 0;
5826    bool MayBePseudoDestructor = false;
5827    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5828                                                E->getOperatorLoc(),
5829                                      E->isArrow()? tok::arrow : tok::period,
5830                                                ObjectTy,
5831                                                MayBePseudoDestructor);
5832    if (Base.isInvalid())
5833      return SemaRef.ExprError();
5834
5835    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5836    BaseType = ((Expr*) Base.get())->getType();
5837  } else {
5838    OldBase = 0;
5839    BaseType = getDerived().TransformType(E->getBaseType());
5840    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5841  }
5842
5843  // Transform the first part of the nested-name-specifier that qualifies
5844  // the member name.
5845  NamedDecl *FirstQualifierInScope
5846    = getDerived().TransformFirstQualifierInScope(
5847                                          E->getFirstQualifierFoundInScope(),
5848                                          E->getQualifierRange().getBegin());
5849
5850  NestedNameSpecifier *Qualifier = 0;
5851  if (E->getQualifier()) {
5852    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5853                                                      E->getQualifierRange(),
5854                                                      ObjectType,
5855                                                      FirstQualifierInScope);
5856    if (!Qualifier)
5857      return SemaRef.ExprError();
5858  }
5859
5860  DeclarationName Name
5861    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
5862                                            ObjectType);
5863  if (!Name)
5864    return SemaRef.ExprError();
5865
5866  if (!E->hasExplicitTemplateArgs()) {
5867    // This is a reference to a member without an explicitly-specified
5868    // template argument list. Optimize for this common case.
5869    if (!getDerived().AlwaysRebuild() &&
5870        Base.get() == OldBase &&
5871        BaseType == E->getBaseType() &&
5872        Qualifier == E->getQualifier() &&
5873        Name == E->getMember() &&
5874        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
5875      return SemaRef.Owned(E->Retain());
5876
5877    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5878                                                       BaseType,
5879                                                       E->isArrow(),
5880                                                       E->getOperatorLoc(),
5881                                                       Qualifier,
5882                                                       E->getQualifierRange(),
5883                                                       FirstQualifierInScope,
5884                                                       Name,
5885                                                       E->getMemberLoc(),
5886                                                       /*TemplateArgs*/ 0);
5887  }
5888
5889  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5890  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5891    TemplateArgumentLoc Loc;
5892    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5893      return SemaRef.ExprError();
5894    TransArgs.addArgument(Loc);
5895  }
5896
5897  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5898                                                     BaseType,
5899                                                     E->isArrow(),
5900                                                     E->getOperatorLoc(),
5901                                                     Qualifier,
5902                                                     E->getQualifierRange(),
5903                                                     FirstQualifierInScope,
5904                                                     Name,
5905                                                     E->getMemberLoc(),
5906                                                     &TransArgs);
5907}
5908
5909template<typename Derived>
5910Sema::OwningExprResult
5911TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5912  // Transform the base of the expression.
5913  OwningExprResult Base(SemaRef, (Expr*) 0);
5914  QualType BaseType;
5915  if (!Old->isImplicitAccess()) {
5916    Base = getDerived().TransformExpr(Old->getBase());
5917    if (Base.isInvalid())
5918      return SemaRef.ExprError();
5919    BaseType = ((Expr*) Base.get())->getType();
5920  } else {
5921    BaseType = getDerived().TransformType(Old->getBaseType());
5922  }
5923
5924  NestedNameSpecifier *Qualifier = 0;
5925  if (Old->getQualifier()) {
5926    Qualifier
5927      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5928                                                  Old->getQualifierRange());
5929    if (Qualifier == 0)
5930      return SemaRef.ExprError();
5931  }
5932
5933  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5934                 Sema::LookupOrdinaryName);
5935
5936  // Transform all the decls.
5937  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5938         E = Old->decls_end(); I != E; ++I) {
5939    NamedDecl *InstD = static_cast<NamedDecl*>(
5940                                getDerived().TransformDecl(Old->getMemberLoc(),
5941                                                           *I));
5942    if (!InstD) {
5943      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
5944      // This can happen because of dependent hiding.
5945      if (isa<UsingShadowDecl>(*I))
5946        continue;
5947      else
5948        return SemaRef.ExprError();
5949    }
5950
5951    // Expand using declarations.
5952    if (isa<UsingDecl>(InstD)) {
5953      UsingDecl *UD = cast<UsingDecl>(InstD);
5954      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5955             E = UD->shadow_end(); I != E; ++I)
5956        R.addDecl(*I);
5957      continue;
5958    }
5959
5960    R.addDecl(InstD);
5961  }
5962
5963  R.resolveKind();
5964
5965  // Determine the naming class.
5966  if (Old->getNamingClass()) {
5967    CXXRecordDecl *NamingClass
5968      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
5969                                                          Old->getMemberLoc(),
5970                                                        Old->getNamingClass()));
5971    if (!NamingClass)
5972      return SemaRef.ExprError();
5973
5974    R.setNamingClass(NamingClass);
5975  }
5976
5977  TemplateArgumentListInfo TransArgs;
5978  if (Old->hasExplicitTemplateArgs()) {
5979    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5980    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5981    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5982      TemplateArgumentLoc Loc;
5983      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5984                                                 Loc))
5985        return SemaRef.ExprError();
5986      TransArgs.addArgument(Loc);
5987    }
5988  }
5989
5990  // FIXME: to do this check properly, we will need to preserve the
5991  // first-qualifier-in-scope here, just in case we had a dependent
5992  // base (and therefore couldn't do the check) and a
5993  // nested-name-qualifier (and therefore could do the lookup).
5994  NamedDecl *FirstQualifierInScope = 0;
5995
5996  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5997                                                  BaseType,
5998                                                  Old->getOperatorLoc(),
5999                                                  Old->isArrow(),
6000                                                  Qualifier,
6001                                                  Old->getQualifierRange(),
6002                                                  FirstQualifierInScope,
6003                                                  R,
6004                                              (Old->hasExplicitTemplateArgs()
6005                                                  ? &TransArgs : 0));
6006}
6007
6008template<typename Derived>
6009Sema::OwningExprResult
6010TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
6011  return SemaRef.Owned(E->Retain());
6012}
6013
6014template<typename Derived>
6015Sema::OwningExprResult
6016TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
6017  TypeSourceInfo *EncodedTypeInfo
6018    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
6019  if (!EncodedTypeInfo)
6020    return SemaRef.ExprError();
6021
6022  if (!getDerived().AlwaysRebuild() &&
6023      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
6024    return SemaRef.Owned(E->Retain());
6025
6026  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
6027                                            EncodedTypeInfo,
6028                                            E->getRParenLoc());
6029}
6030
6031template<typename Derived>
6032Sema::OwningExprResult
6033TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
6034  // Transform arguments.
6035  bool ArgChanged = false;
6036  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
6037  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
6038    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
6039    if (Arg.isInvalid())
6040      return SemaRef.ExprError();
6041
6042    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
6043    Args.push_back(Arg.takeAs<Expr>());
6044  }
6045
6046  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
6047    // Class message: transform the receiver type.
6048    TypeSourceInfo *ReceiverTypeInfo
6049      = getDerived().TransformType(E->getClassReceiverTypeInfo());
6050    if (!ReceiverTypeInfo)
6051      return SemaRef.ExprError();
6052
6053    // If nothing changed, just retain the existing message send.
6054    if (!getDerived().AlwaysRebuild() &&
6055        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
6056      return SemaRef.Owned(E->Retain());
6057
6058    // Build a new class message send.
6059    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
6060                                               E->getSelector(),
6061                                               E->getMethodDecl(),
6062                                               E->getLeftLoc(),
6063                                               move_arg(Args),
6064                                               E->getRightLoc());
6065  }
6066
6067  // Instance message: transform the receiver
6068  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
6069         "Only class and instance messages may be instantiated");
6070  OwningExprResult Receiver
6071    = getDerived().TransformExpr(E->getInstanceReceiver());
6072  if (Receiver.isInvalid())
6073    return SemaRef.ExprError();
6074
6075  // If nothing changed, just retain the existing message send.
6076  if (!getDerived().AlwaysRebuild() &&
6077      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
6078    return SemaRef.Owned(E->Retain());
6079
6080  // Build a new instance message send.
6081  return getDerived().RebuildObjCMessageExpr(move(Receiver),
6082                                             E->getSelector(),
6083                                             E->getMethodDecl(),
6084                                             E->getLeftLoc(),
6085                                             move_arg(Args),
6086                                             E->getRightLoc());
6087}
6088
6089template<typename Derived>
6090Sema::OwningExprResult
6091TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
6092  return SemaRef.Owned(E->Retain());
6093}
6094
6095template<typename Derived>
6096Sema::OwningExprResult
6097TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6098  return SemaRef.Owned(E->Retain());
6099}
6100
6101template<typename Derived>
6102Sema::OwningExprResult
6103TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6104  // Transform the base expression.
6105  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6106  if (Base.isInvalid())
6107    return SemaRef.ExprError();
6108
6109  // We don't need to transform the ivar; it will never change.
6110
6111  // If nothing changed, just retain the existing expression.
6112  if (!getDerived().AlwaysRebuild() &&
6113      Base.get() == E->getBase())
6114    return SemaRef.Owned(E->Retain());
6115
6116  return getDerived().RebuildObjCIvarRefExpr(move(Base), E->getDecl(),
6117                                             E->getLocation(),
6118                                             E->isArrow(), E->isFreeIvar());
6119}
6120
6121template<typename Derived>
6122Sema::OwningExprResult
6123TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6124  // Transform the base expression.
6125  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6126  if (Base.isInvalid())
6127    return SemaRef.ExprError();
6128
6129  // We don't need to transform the property; it will never change.
6130
6131  // If nothing changed, just retain the existing expression.
6132  if (!getDerived().AlwaysRebuild() &&
6133      Base.get() == E->getBase())
6134    return SemaRef.Owned(E->Retain());
6135
6136  return getDerived().RebuildObjCPropertyRefExpr(move(Base), E->getProperty(),
6137                                                 E->getLocation());
6138}
6139
6140template<typename Derived>
6141Sema::OwningExprResult
6142TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6143                                          ObjCImplicitSetterGetterRefExpr *E) {
6144  // If this implicit setter/getter refers to class methods, it cannot have any
6145  // dependent parts. Just retain the existing declaration.
6146  if (E->getInterfaceDecl())
6147    return SemaRef.Owned(E->Retain());
6148
6149  // Transform the base expression.
6150  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6151  if (Base.isInvalid())
6152    return SemaRef.ExprError();
6153
6154  // We don't need to transform the getters/setters; they will never change.
6155
6156  // If nothing changed, just retain the existing expression.
6157  if (!getDerived().AlwaysRebuild() &&
6158      Base.get() == E->getBase())
6159    return SemaRef.Owned(E->Retain());
6160
6161  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
6162                                                          E->getGetterMethod(),
6163                                                             E->getType(),
6164                                                          E->getSetterMethod(),
6165                                                             E->getLocation(),
6166                                                             move(Base));
6167
6168}
6169
6170template<typename Derived>
6171Sema::OwningExprResult
6172TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6173  // Can never occur in a dependent context.
6174  return SemaRef.Owned(E->Retain());
6175}
6176
6177template<typename Derived>
6178Sema::OwningExprResult
6179TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6180  // Transform the base expression.
6181  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6182  if (Base.isInvalid())
6183    return SemaRef.ExprError();
6184
6185  // If nothing changed, just retain the existing expression.
6186  if (!getDerived().AlwaysRebuild() &&
6187      Base.get() == E->getBase())
6188    return SemaRef.Owned(E->Retain());
6189
6190  return getDerived().RebuildObjCIsaExpr(move(Base), E->getIsaMemberLoc(),
6191                                         E->isArrow());
6192}
6193
6194template<typename Derived>
6195Sema::OwningExprResult
6196TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6197  bool ArgumentChanged = false;
6198  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
6199  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
6200    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6201    if (SubExpr.isInvalid())
6202      return SemaRef.ExprError();
6203
6204    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
6205    SubExprs.push_back(SubExpr.takeAs<Expr>());
6206  }
6207
6208  if (!getDerived().AlwaysRebuild() &&
6209      !ArgumentChanged)
6210    return SemaRef.Owned(E->Retain());
6211
6212  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6213                                               move_arg(SubExprs),
6214                                               E->getRParenLoc());
6215}
6216
6217template<typename Derived>
6218Sema::OwningExprResult
6219TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6220  // FIXME: Implement this!
6221  assert(false && "Cannot transform block expressions yet");
6222  return SemaRef.Owned(E->Retain());
6223}
6224
6225template<typename Derived>
6226Sema::OwningExprResult
6227TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6228  // FIXME: Implement this!
6229  assert(false && "Cannot transform block-related expressions yet");
6230  return SemaRef.Owned(E->Retain());
6231}
6232
6233//===----------------------------------------------------------------------===//
6234// Type reconstruction
6235//===----------------------------------------------------------------------===//
6236
6237template<typename Derived>
6238QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
6239                                                    SourceLocation Star) {
6240  return SemaRef.BuildPointerType(PointeeType, Star,
6241                                  getDerived().getBaseEntity());
6242}
6243
6244template<typename Derived>
6245QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
6246                                                         SourceLocation Star) {
6247  return SemaRef.BuildBlockPointerType(PointeeType, Star,
6248                                       getDerived().getBaseEntity());
6249}
6250
6251template<typename Derived>
6252QualType
6253TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
6254                                             bool WrittenAsLValue,
6255                                             SourceLocation Sigil) {
6256  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
6257                                    Sigil, getDerived().getBaseEntity());
6258}
6259
6260template<typename Derived>
6261QualType
6262TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
6263                                                 QualType ClassType,
6264                                                 SourceLocation Sigil) {
6265  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
6266                                        Sigil, getDerived().getBaseEntity());
6267}
6268
6269template<typename Derived>
6270QualType
6271TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6272                                         ArrayType::ArraySizeModifier SizeMod,
6273                                         const llvm::APInt *Size,
6274                                         Expr *SizeExpr,
6275                                         unsigned IndexTypeQuals,
6276                                         SourceRange BracketsRange) {
6277  if (SizeExpr || !Size)
6278    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6279                                  IndexTypeQuals, BracketsRange,
6280                                  getDerived().getBaseEntity());
6281
6282  QualType Types[] = {
6283    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
6284    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
6285    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6286  };
6287  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6288  QualType SizeType;
6289  for (unsigned I = 0; I != NumTypes; ++I)
6290    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6291      SizeType = Types[I];
6292      break;
6293    }
6294
6295  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
6296  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6297                                IndexTypeQuals, BracketsRange,
6298                                getDerived().getBaseEntity());
6299}
6300
6301template<typename Derived>
6302QualType
6303TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6304                                                 ArrayType::ArraySizeModifier SizeMod,
6305                                                 const llvm::APInt &Size,
6306                                                 unsigned IndexTypeQuals,
6307                                                 SourceRange BracketsRange) {
6308  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
6309                                        IndexTypeQuals, BracketsRange);
6310}
6311
6312template<typename Derived>
6313QualType
6314TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6315                                          ArrayType::ArraySizeModifier SizeMod,
6316                                                 unsigned IndexTypeQuals,
6317                                                   SourceRange BracketsRange) {
6318  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
6319                                       IndexTypeQuals, BracketsRange);
6320}
6321
6322template<typename Derived>
6323QualType
6324TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6325                                          ArrayType::ArraySizeModifier SizeMod,
6326                                                 ExprArg SizeExpr,
6327                                                 unsigned IndexTypeQuals,
6328                                                 SourceRange BracketsRange) {
6329  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6330                                       SizeExpr.takeAs<Expr>(),
6331                                       IndexTypeQuals, BracketsRange);
6332}
6333
6334template<typename Derived>
6335QualType
6336TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6337                                          ArrayType::ArraySizeModifier SizeMod,
6338                                                       ExprArg SizeExpr,
6339                                                       unsigned IndexTypeQuals,
6340                                                   SourceRange BracketsRange) {
6341  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6342                                       SizeExpr.takeAs<Expr>(),
6343                                       IndexTypeQuals, BracketsRange);
6344}
6345
6346template<typename Derived>
6347QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
6348                                     unsigned NumElements,
6349                                     VectorType::AltiVecSpecific AltiVecSpec) {
6350  // FIXME: semantic checking!
6351  return SemaRef.Context.getVectorType(ElementType, NumElements, AltiVecSpec);
6352}
6353
6354template<typename Derived>
6355QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6356                                                      unsigned NumElements,
6357                                                 SourceLocation AttributeLoc) {
6358  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6359                          NumElements, true);
6360  IntegerLiteral *VectorSize
6361    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6362                                           AttributeLoc);
6363  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
6364                                    AttributeLoc);
6365}
6366
6367template<typename Derived>
6368QualType
6369TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
6370                                                           ExprArg SizeExpr,
6371                                                  SourceLocation AttributeLoc) {
6372  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
6373}
6374
6375template<typename Derived>
6376QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
6377                                                          QualType *ParamTypes,
6378                                                        unsigned NumParamTypes,
6379                                                          bool Variadic,
6380                                                          unsigned Quals) {
6381  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6382                                   Quals,
6383                                   getDerived().getBaseLocation(),
6384                                   getDerived().getBaseEntity());
6385}
6386
6387template<typename Derived>
6388QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6389  return SemaRef.Context.getFunctionNoProtoType(T);
6390}
6391
6392template<typename Derived>
6393QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6394  assert(D && "no decl found");
6395  if (D->isInvalidDecl()) return QualType();
6396
6397  // FIXME: Doesn't account for ObjCInterfaceDecl!
6398  TypeDecl *Ty;
6399  if (isa<UsingDecl>(D)) {
6400    UsingDecl *Using = cast<UsingDecl>(D);
6401    assert(Using->isTypeName() &&
6402           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6403
6404    // A valid resolved using typename decl points to exactly one type decl.
6405    assert(++Using->shadow_begin() == Using->shadow_end());
6406    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6407
6408  } else {
6409    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6410           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6411    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6412  }
6413
6414  return SemaRef.Context.getTypeDeclType(Ty);
6415}
6416
6417template<typename Derived>
6418QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
6419  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
6420}
6421
6422template<typename Derived>
6423QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6424  return SemaRef.Context.getTypeOfType(Underlying);
6425}
6426
6427template<typename Derived>
6428QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
6429  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
6430}
6431
6432template<typename Derived>
6433QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6434                                                      TemplateName Template,
6435                                             SourceLocation TemplateNameLoc,
6436                               const TemplateArgumentListInfo &TemplateArgs) {
6437  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6438}
6439
6440template<typename Derived>
6441NestedNameSpecifier *
6442TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6443                                                   SourceRange Range,
6444                                                   IdentifierInfo &II,
6445                                                   QualType ObjectType,
6446                                                   NamedDecl *FirstQualifierInScope) {
6447  CXXScopeSpec SS;
6448  // FIXME: The source location information is all wrong.
6449  SS.setRange(Range);
6450  SS.setScopeRep(Prefix);
6451  return static_cast<NestedNameSpecifier *>(
6452                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6453                                                        Range.getEnd(), II,
6454                                                        ObjectType,
6455                                                        FirstQualifierInScope,
6456                                                        false, false));
6457}
6458
6459template<typename Derived>
6460NestedNameSpecifier *
6461TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6462                                                   SourceRange Range,
6463                                                   NamespaceDecl *NS) {
6464  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6465}
6466
6467template<typename Derived>
6468NestedNameSpecifier *
6469TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6470                                                   SourceRange Range,
6471                                                   bool TemplateKW,
6472                                                   QualType T) {
6473  if (T->isDependentType() || T->isRecordType() ||
6474      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6475    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6476    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6477                                       T.getTypePtr());
6478  }
6479
6480  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6481  return 0;
6482}
6483
6484template<typename Derived>
6485TemplateName
6486TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6487                                            bool TemplateKW,
6488                                            TemplateDecl *Template) {
6489  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6490                                                  Template);
6491}
6492
6493template<typename Derived>
6494TemplateName
6495TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6496                                            const IdentifierInfo &II,
6497                                            QualType ObjectType) {
6498  CXXScopeSpec SS;
6499  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6500  SS.setScopeRep(Qualifier);
6501  UnqualifiedId Name;
6502  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
6503  Sema::TemplateTy Template;
6504  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6505                                       /*FIXME:*/getDerived().getBaseLocation(),
6506                                       SS,
6507                                       Name,
6508                                       ObjectType.getAsOpaquePtr(),
6509                                       /*EnteringContext=*/false,
6510                                       Template);
6511  return Template.template getAsVal<TemplateName>();
6512}
6513
6514template<typename Derived>
6515TemplateName
6516TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6517                                            OverloadedOperatorKind Operator,
6518                                            QualType ObjectType) {
6519  CXXScopeSpec SS;
6520  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6521  SS.setScopeRep(Qualifier);
6522  UnqualifiedId Name;
6523  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6524  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6525                             Operator, SymbolLocations);
6526  Sema::TemplateTy Template;
6527  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6528                                       /*FIXME:*/getDerived().getBaseLocation(),
6529                                       SS,
6530                                       Name,
6531                                       ObjectType.getAsOpaquePtr(),
6532                                       /*EnteringContext=*/false,
6533                                       Template);
6534  return Template.template getAsVal<TemplateName>();
6535}
6536
6537template<typename Derived>
6538Sema::OwningExprResult
6539TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6540                                                   SourceLocation OpLoc,
6541                                                   ExprArg Callee,
6542                                                   ExprArg First,
6543                                                   ExprArg Second) {
6544  Expr *FirstExpr = (Expr *)First.get();
6545  Expr *SecondExpr = (Expr *)Second.get();
6546  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
6547  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
6548
6549  // Determine whether this should be a builtin operation.
6550  if (Op == OO_Subscript) {
6551    if (!FirstExpr->getType()->isOverloadableType() &&
6552        !SecondExpr->getType()->isOverloadableType())
6553      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
6554                                                 CalleeExpr->getLocStart(),
6555                                                       move(Second), OpLoc);
6556  } else if (Op == OO_Arrow) {
6557    // -> is never a builtin operation.
6558    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
6559  } else if (SecondExpr == 0 || isPostIncDec) {
6560    if (!FirstExpr->getType()->isOverloadableType()) {
6561      // The argument is not of overloadable type, so try to create a
6562      // built-in unary operation.
6563      UnaryOperator::Opcode Opc
6564        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6565
6566      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
6567    }
6568  } else {
6569    if (!FirstExpr->getType()->isOverloadableType() &&
6570        !SecondExpr->getType()->isOverloadableType()) {
6571      // Neither of the arguments is an overloadable type, so try to
6572      // create a built-in binary operation.
6573      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
6574      OwningExprResult Result
6575        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
6576      if (Result.isInvalid())
6577        return SemaRef.ExprError();
6578
6579      First.release();
6580      Second.release();
6581      return move(Result);
6582    }
6583  }
6584
6585  // Compute the transformed set of functions (and function templates) to be
6586  // used during overload resolution.
6587  UnresolvedSet<16> Functions;
6588
6589  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
6590    assert(ULE->requiresADL());
6591
6592    // FIXME: Do we have to check
6593    // IsAcceptableNonMemberOperatorCandidate for each of these?
6594    Functions.append(ULE->decls_begin(), ULE->decls_end());
6595  } else {
6596    Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl());
6597  }
6598
6599  // Add any functions found via argument-dependent lookup.
6600  Expr *Args[2] = { FirstExpr, SecondExpr };
6601  unsigned NumArgs = 1 + (SecondExpr != 0);
6602
6603  // Create the overloaded operator invocation for unary operators.
6604  if (NumArgs == 1 || isPostIncDec) {
6605    UnaryOperator::Opcode Opc
6606      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6607    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
6608  }
6609
6610  if (Op == OO_Subscript)
6611    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
6612                                                      OpLoc,
6613                                                      move(First),
6614                                                      move(Second));
6615
6616  // Create the overloaded operator invocation for binary operators.
6617  BinaryOperator::Opcode Opc =
6618    BinaryOperator::getOverloadedOpcode(Op);
6619  OwningExprResult Result
6620    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6621  if (Result.isInvalid())
6622    return SemaRef.ExprError();
6623
6624  First.release();
6625  Second.release();
6626  return move(Result);
6627}
6628
6629template<typename Derived>
6630Sema::OwningExprResult
6631TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base,
6632                                                     SourceLocation OperatorLoc,
6633                                                       bool isArrow,
6634                                                 NestedNameSpecifier *Qualifier,
6635                                                     SourceRange QualifierRange,
6636                                                     TypeSourceInfo *ScopeType,
6637                                                       SourceLocation CCLoc,
6638                                                       SourceLocation TildeLoc,
6639                                        PseudoDestructorTypeStorage Destroyed) {
6640  CXXScopeSpec SS;
6641  if (Qualifier) {
6642    SS.setRange(QualifierRange);
6643    SS.setScopeRep(Qualifier);
6644  }
6645
6646  Expr *BaseE = (Expr *)Base.get();
6647  QualType BaseType = BaseE->getType();
6648  if (BaseE->isTypeDependent() || Destroyed.getIdentifier() ||
6649      (!isArrow && !BaseType->getAs<RecordType>()) ||
6650      (isArrow && BaseType->getAs<PointerType>() &&
6651       !BaseType->getAs<PointerType>()->getPointeeType()
6652                                              ->template getAs<RecordType>())){
6653    // This pseudo-destructor expression is still a pseudo-destructor.
6654    return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc,
6655                                             isArrow? tok::arrow : tok::period,
6656                                             SS, ScopeType, CCLoc, TildeLoc,
6657                                             Destroyed,
6658                                             /*FIXME?*/true);
6659  }
6660
6661  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
6662  DeclarationName Name
6663    = SemaRef.Context.DeclarationNames.getCXXDestructorName(
6664                SemaRef.Context.getCanonicalType(DestroyedType->getType()));
6665
6666  // FIXME: the ScopeType should be tacked onto SS.
6667
6668  return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
6669                                            OperatorLoc, isArrow,
6670                                            SS, /*FIXME: FirstQualifier*/ 0,
6671                                            Name, Destroyed.getLocation(),
6672                                            /*TemplateArgs*/ 0);
6673}
6674
6675} // end namespace clang
6676
6677#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6678