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