diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/ParseAST.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.h | 16 |
3 files changed, 24 insertions, 6 deletions
diff --git a/clang/lib/Sema/ParseAST.cpp b/clang/lib/Sema/ParseAST.cpp index bb5acb0ee8d..d237f7539e4 100644 --- a/clang/lib/Sema/ParseAST.cpp +++ b/clang/lib/Sema/ParseAST.cpp @@ -29,14 +29,15 @@ using namespace clang; /// held by Ctx. /// void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, - ASTContext &Ctx, bool PrintStats) { + ASTContext &Ctx, bool PrintStats, + bool CompleteTranslationUnit) { // Collect global stats on Decls/Stmts (until we have a module streamer). if (PrintStats) { Decl::CollectingStats(true); Stmt::CollectingStats(true); } - Sema S(PP, Ctx, *Consumer); + Sema S(PP, Ctx, *Consumer, CompleteTranslationUnit); Parser P(PP, S); PP.EnterMainSourceFile(); diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index f11ce2043a8..403e8f60f56 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -151,12 +151,14 @@ void Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) { Context.setObjCIdType(IdTypedef); } -Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) +Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, + bool CompleteTranslationUnit) : LangOpts(pp.getLangOptions()), PP(pp), Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()), CurContext(0), PreDeclaratorDC(0), CurBlock(0), PackContext(0), IdResolver(pp.getLangOptions()), - GlobalNewDeleteDeclared(false) { + GlobalNewDeleteDeclared(false), + CompleteTranslationUnit(CompleteTranslationUnit) { // Get IdentifierInfo objects for known functions for which we // do extra checking. @@ -216,6 +218,9 @@ void Sema::DeleteStmt(StmtTy *S) { /// translation unit when EOF is reached and all but the top-level scope is /// popped. void Sema::ActOnEndOfTranslationUnit() { + if (!CompleteTranslationUnit) + return; + // C99 6.9.2p2: // A declaration of an identifier for an object that has file // scope without an initializer, and without a storage-class diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index f48e75afb35..d64228794bd 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -214,7 +214,18 @@ public: /// A flag to remember whether the implicit forms of operator new and delete /// have been declared. bool GlobalNewDeleteDeclared; - + + /// \brief Whether the code handled by Sema should be considered a + /// complete translation unit or not. + /// + /// When true (which is generally the case), Sema will perform + /// end-of-translation-unit semantic tasks (such as creating + /// initializers for tentative definitions in C) once parsing has + /// completed. This flag will be false when building PCH files, + /// since a PCH file is by definition not a complete translation + /// unit. + bool CompleteTranslationUnit; + /// ObjCMethodList - a linked list of methods with different signatures. struct ObjCMethodList { ObjCMethodDecl *Method; @@ -239,7 +250,8 @@ public: /// Private Helper predicate to check for 'self'. bool isSelfExpr(Expr *RExpr); public: - Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer); + Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, + bool CompleteTranslationUnit = true); ~Sema() { if (PackContext) FreePackedContext(); } |