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