Sema.cpp revision 44b4321feab46299d3f5cfd404680884752a0fcf
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the actions class which performs semantic analysis and 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// builds an AST out of a parse stream. 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "Sema.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 17c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h" 18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/Diagnostic.h" 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2322caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner/// ConvertQualTypeToStringFn - This function is used to pretty print the 2422caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner/// specified QualType as a string in diagnostics. 25011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattnerstatic void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val, 26077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner const char *Modifier, unsigned ModLen, 2722caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner const char *Argument, unsigned ArgLen, 2822caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner llvm::SmallVectorImpl<char> &Output) { 293fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner 30011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner std::string S; 31011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner if (Kind == Diagnostic::ak_qualtype) { 32011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(Val))); 33077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner 34011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner // FIXME: Playing with std::string is really slow. 35011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner S = Ty.getAsString(); 36077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner 37077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner assert(ModLen == 0 && ArgLen == 0 && 38077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner "Invalid modifier for QualType argument"); 39077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner 40011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner } else { 41011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner assert(Kind == Diagnostic::ak_declarationname); 42011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner 43011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner DeclarationName N = DeclarationName::getFromOpaqueInteger(Val); 44011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner S = N.getAsString(); 45077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner 46077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner if (ModLen == 9 && !memcmp(Modifier, "objcclass", 9) && ArgLen == 0) 47077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S = '+' + S; 48077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner else if (ModLen == 12 && !memcmp(Modifier, "objcinstance", 12) && ArgLen==0) 49077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S = '-' + S; 50077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner else 51077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner assert(ModLen == 0 && ArgLen == 0 && 52077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner "Invalid modifier for DeclarationName argument"); 53011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner } 5422caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner Output.append(S.begin(), S.end()); 5522caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner} 5622caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner 5722caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner 580a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattnerstatic inline RecordDecl *CreateStructDecl(ASTContext &C, const char *Name) { 59c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson if (C.getLangOptions().CPlusPlus) 60c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson return CXXRecordDecl::Create(C, TagDecl::TK_struct, 61c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson C.getTranslationUnitDecl(), 62df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek SourceLocation(), &C.Idents.get(Name)); 63fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner 64fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner return RecordDecl::Create(C, TagDecl::TK_struct, 65fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner C.getTranslationUnitDecl(), 66fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner SourceLocation(), &C.Idents.get(Name)); 67c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson} 68c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson 698ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroffvoid Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) { 708ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff TUScope = S; 7144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor PushDeclContext(S, Context.getTranslationUnitDecl()); 722ae34ed8caf90ca4044feca07811561053c08666Chris Lattner if (!PP.getLangOptions().ObjC1) return; 732ae34ed8caf90ca4044feca07811561053c08666Chris Lattner 7469d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff // Synthesize "typedef struct objc_selector *SEL;" 75c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson RecordDecl *SelTag = CreateStructDecl(Context, "objc_selector"); 7687f3ff0c27be71cfd0eaf4628eb64538e84ee6ceArgyrios Kyrtzidis PushOnScopeChains(SelTag, TUScope); 7769d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff 7869d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff QualType SelT = Context.getPointerType(Context.getTagDeclType(SelTag)); 790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner TypedefDecl *SelTypedef = TypedefDecl::Create(Context, CurContext, 800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation(), 816c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner &Context.Idents.get("SEL"), 82c63e660882ff93841fa234d70ef6757038302b92Chris Lattner SelT, 0); 8387f3ff0c27be71cfd0eaf4628eb64538e84ee6ceArgyrios Kyrtzidis PushOnScopeChains(SelTypedef, TUScope); 8469d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff Context.setObjCSelType(SelTypedef); 856ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner 8627933c17617efe4902a7d4a9f52c751f85a7d92fChris Lattner // FIXME: Make sure these don't leak! 87c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson RecordDecl *ClassTag = CreateStructDecl(Context, "objc_class"); 886ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner QualType ClassT = Context.getPointerType(Context.getTagDeclType(ClassTag)); 896ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner TypedefDecl *ClassTypedef = 906ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner TypedefDecl::Create(Context, CurContext, SourceLocation(), 916ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("Class"), ClassT, 0); 926ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ClassTag, TUScope); 936ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ClassTypedef, TUScope); 946ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner Context.setObjCClassType(ClassTypedef); 956ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner // Synthesize "@class Protocol; 966ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner ObjCInterfaceDecl *ProtocolDecl = 97b752f289026ad8e5f44851b20e009a27ed61eefcChris Lattner ObjCInterfaceDecl::Create(Context, SourceLocation(), 986ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("Protocol"), 996ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner SourceLocation(), true); 1006ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl)); 1016ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ProtocolDecl, TUScope); 1026ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner 1036ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner // Synthesize "typedef struct objc_object { Class isa; } *id;" 104c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson RecordDecl *ObjectTag = CreateStructDecl(Context, "objc_object"); 105c303606a8e2c1b7f8c985d0e7adf9fb9bb818070Anders Carlsson 1066ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner QualType ObjT = Context.getPointerType(Context.getTagDeclType(ObjectTag)); 1076ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ObjectTag, TUScope); 1086ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner TypedefDecl *IdTypedef = TypedefDecl::Create(Context, CurContext, 1096ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner SourceLocation(), 1106ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("id"), 1116ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner ObjT, 0); 1126ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(IdTypedef, TUScope); 1136ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner Context.setObjCIdType(IdTypedef); 114b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1153b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff 1162ae34ed8caf90ca4044feca07811561053c08666Chris LattnerSema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) 1173cfa928f9c9bdc5a12f4c4902cd932babc9c7bc1Chris Lattner : PP(pp), Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()), 1183cfa928f9c9bdc5a12f4c4902cd932babc9c7bc1Chris Lattner SourceMgr(PP.getSourceManager()), CurContext(0), PreDeclaratorDC(0), 119b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl CurBlock(0), PackContext(0), IdResolver(pp.getLangOptions()), 120b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl GlobalNewDeleteDeclared(false) { 12159907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner 12259907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner // Get IdentifierInfo objects for known functions for which we 12359907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner // do extra checking. 1242ae34ed8caf90ca4044feca07811561053c08666Chris Lattner IdentifierTable &IT = PP.getIdentifierTable(); 12559907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner 126de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_printf] = &IT.get("printf"); 127de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_fprintf] = &IT.get("fprintf"); 128de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_sprintf] = &IT.get("sprintf"); 129de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_sprintf_chk] = &IT.get("__builtin___sprintf_chk"); 130de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_snprintf] = &IT.get("snprintf"); 131de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_snprintf_chk] = &IT.get("__builtin___snprintf_chk"); 132de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_asprintf] = &IT.get("asprintf"); 133de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_NSLog] = &IT.get("NSLog"); 134de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vsnprintf] = &IT.get("vsnprintf"); 135de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vasprintf] = &IT.get("vasprintf"); 136de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vfprintf] = &IT.get("vfprintf"); 137de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vsprintf] = &IT.get("vsprintf"); 138de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vsprintf_chk] = &IT.get("__builtin___vsprintf_chk"); 139de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vsnprintf] = &IT.get("vsnprintf"); 140de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vsnprintf_chk] = &IT.get("__builtin___vsnprintf_chk"); 141de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar KnownFunctionIDs[id_vprintf] = &IT.get("vprintf"); 1428ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff 143c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl StdNamespace = 0; 1443b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff TUScope = 0; 14507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis if (getLangOptions().CPlusPlus) 14607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis FieldCollector.reset(new CXXFieldCollector()); 14722caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner 14822caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner // Tell diagnostics how to render things from the AST library. 1493fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner PP.getDiagnostics().SetArgToStringFn(ConvertArgToStringFn); 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1521e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast. 1531e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner/// If there is already an implicit cast, merge into the existing one. 154eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor /// If isLvalue, the result of the cast is an lvalue. 155eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregorvoid Sema::ImpCastExprToType(Expr *&Expr, QualType Ty, bool isLvalue) { 1563a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang QualType ExprTy = Context.getCanonicalType(Expr->getType()); 1573a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang QualType TypeTy = Context.getCanonicalType(Ty); 1583a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang 1593a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang if (ExprTy == TypeTy) 1603a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang return; 1613a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang 1623a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang if (Expr->getType().getTypePtr()->isPointerType() && 1633a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang Ty.getTypePtr()->isPointerType()) { 1643a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang QualType ExprBaseType = 1653a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang cast<PointerType>(ExprTy.getUnqualifiedType())->getPointeeType(); 1663a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang QualType BaseType = 1673a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang cast<PointerType>(TypeTy.getUnqualifiedType())->getPointeeType(); 1683a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang if (ExprBaseType.getAddressSpace() != BaseType.getAddressSpace()) { 169dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner Diag(Expr->getExprLoc(), diag::err_implicit_pointer_address_space_cast) 170dcd5ef12488e4c7ea844327835896ca86b609a97Chris Lattner << Expr->getSourceRange(); 1713a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang } 1723a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang } 1731e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner 174eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(Expr)) { 1753a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang ImpCast->setType(Ty); 176eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor ImpCast->setLvalueCast(isLvalue); 177eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor } else 178eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor Expr = new ImplicitCastExpr(Ty, Expr, isLvalue); 1791e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner} 1801e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner 181394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattnervoid Sema::DeleteExpr(ExprTy *E) { 182394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner delete static_cast<Expr*>(E); 183394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner} 184394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattnervoid Sema::DeleteStmt(StmtTy *S) { 185394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner delete static_cast<Stmt*>(S); 186394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner} 187394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner 1889299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// ActOnEndOfTranslationUnit - This is called at the very end of the 1899299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// translation unit when EOF is reached and all but the top-level scope is 1909299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// popped. 1919299f3fa85796613cc787a2062c9562d07c8613eChris Lattnervoid Sema::ActOnEndOfTranslationUnit() { 1929299f3fa85796613cc787a2062c9562d07c8613eChris Lattner 1939299f3fa85796613cc787a2062c9562d07c8613eChris Lattner} 1949299f3fa85796613cc787a2062c9562d07c8613eChris Lattner 1959299f3fa85796613cc787a2062c9562d07c8613eChris Lattner 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Helper functions. 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst LangOptions &Sema::getLangOptions() const { 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return PP.getLangOptions(); 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 203c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar 204371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// getCurFunctionDecl - If inside of a function body, this returns a pointer 205371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// to the function decl for the function being parsed. If we're currently 206371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// in a 'block', this returns the containing context. 207371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerFunctionDecl *Sema::getCurFunctionDecl() { 208371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner DeclContext *DC = CurContext; 209371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner while (isa<BlockDecl>(DC)) 210371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner DC = DC->getParent(); 211371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner return dyn_cast<FunctionDecl>(DC); 212371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner} 213371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner 214c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel DunbarObjCMethodDecl *Sema::getCurMethodDecl() { 215d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff DeclContext *DC = CurContext; 216d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff while (isa<BlockDecl>(DC)) 217d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff DC = DC->getParent(); 218d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff return dyn_cast<ObjCMethodDecl>(DC); 219c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar} 220371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner 221371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerNamedDecl *Sema::getCurFunctionOrMethodDecl() { 222371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner DeclContext *DC = CurContext; 223371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner while (isa<BlockDecl>(DC)) 224371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner DC = DC->getParent(); 225371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC)) 226371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner return cast<NamedDecl>(DC); 227371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner return 0; 228371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner} 229371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner 230