aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Driver/DiagChecker.cpp13
-rw-r--r--Driver/clang.cpp88
-rw-r--r--Driver/clang.h7
3 files changed, 47 insertions, 61 deletions
diff --git a/Driver/DiagChecker.cpp b/Driver/DiagChecker.cpp
index b921fd19a5..8ffd5eea5c 100644
--- a/Driver/DiagChecker.cpp
+++ b/Driver/DiagChecker.cpp
@@ -223,21 +223,12 @@ static bool CheckResults(Preprocessor &PP,
return HadProblem;
}
-/// CheckDiagnostics - Implement the -parse-ast-check diagnostic verifier.
-bool clang::CheckDiagnostics(Preprocessor &PP, unsigned MainFileID) {
- // Parse the specified input file, building ASTs and performing sema, but
- // doing nothing else.
- return CheckASTConsumer(PP,MainFileID,
- std::auto_ptr<ASTConsumer>(new ASTConsumer()));
-}
/// CheckASTConsumer - Implement diagnostic checking for AST consumers.
bool clang::CheckASTConsumer(Preprocessor &PP, unsigned MainFileID,
- std::auto_ptr<ASTConsumer> C) {
+ ASTConsumer* C) {
- // Local scope to auto release the consumer ...
- { std::auto_ptr<ASTConsumer> Consumer(C);
- ParseAST(PP, MainFileID, *Consumer.get()); }
+ ParseAST(PP, MainFileID, *C);
// Gather the set of expected diagnostics.
DiagList ExpectedErrors, ExpectedWarnings;
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 6ff5580f2c..630ab0723a 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -103,8 +103,6 @@ ProgAction(llvm::cl::desc("Choose output type:"), llvm::cl::ZeroOrMore,
"Print results of live variable analysis."),
clEnumValN(WarnDeadStores, "warn-dead-stores",
"Flag warnings of stores to dead variables."),
- clEnumValN(WarnDeadStoresCheck, "warn-dead-stores-check",
- "Check diagnostics emitted by --warn-dead-stores."),
clEnumValN(WarnUninitVals, "warn-uninit-values",
"Flag warnings of uses of unitialized variables."),
clEnumValN(EmitLLVM, "emit-llvm",
@@ -348,6 +346,9 @@ static llvm::cl::opt<bool>
WarnUnusedMacros("Wunused_macros",
llvm::cl::desc("Warn for unused macros in the main translation unit"));
+static llvm::cl::opt<bool>
+VerifyDiagnostics("verify",
+ llvm::cl::desc("Verify emitted diagnostics and warnings."));
/// InitializeDiagnostics - Initialize the diagnostic object, based on the
/// current command line option settings.
@@ -805,7 +806,11 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
TextDiagnostics &OurDiagnosticClient,
HeaderSearch &HeaderInfo,
const LangOptions &LangInfo) {
+
+ ASTConsumer* Consumer = NULL;
bool ClearSourceMgr = false;
+ bool PerformDiagnosticsCheck = VerifyDiagnostics;
+
switch (ProgAction) {
default:
fprintf(stderr, "Unexpected program action!\n");
@@ -847,62 +852,55 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
ParseFile(PP, CreatePrintParserActionsAction(), MainFileID);
ClearSourceMgr = true;
break;
+
+ case ParseASTCheck:
+ PerformDiagnosticsCheck = true;
case ParseSyntaxOnly: // -fsyntax-only
- case BuildAST: {
- ASTConsumer NullConsumer;
- ParseAST(PP, MainFileID, NullConsumer, Stats);
+ case BuildAST:
+ Consumer = new ASTConsumer();
break;
- }
- case ParseASTPrint: {
- std::auto_ptr<ASTConsumer> C(CreateASTPrinter());
- ParseAST(PP, MainFileID, *C.get(), Stats);
+
+ case ParseASTPrint:
+ Consumer = CreateASTPrinter();
break;
- }
- case ParseASTDump: {
- std::auto_ptr<ASTConsumer> C(CreateASTDumper());
- ParseAST(PP, MainFileID, *C.get(), Stats);
+
+ case ParseASTDump:
+ Consumer = CreateASTDumper();
break;
- }
- case ParseASTView: {
- std::auto_ptr<ASTConsumer> C(CreateASTViewer());
- ParseAST(PP, MainFileID, *C.get(), Stats);
+
+ case ParseASTView:
+ Consumer = CreateASTViewer();
break;
- }
+
case ParseCFGDump:
- case ParseCFGView: {
- std::auto_ptr<ASTConsumer> C(CreateCFGDumper(ProgAction == ParseCFGView));
- ParseAST(PP, MainFileID, *C.get(), Stats);
+ case ParseCFGView:
+ Consumer = CreateCFGDumper(ProgAction == ParseCFGView);
break;
- }
- case AnalysisLiveVariables: {
- std::auto_ptr<ASTConsumer> C(CreateLiveVarAnalyzer());
- ParseAST(PP, MainFileID, *C.get(), Stats);
- break;
- }
- case WarnDeadStores: {
- std::auto_ptr<ASTConsumer> C(CreateDeadStoreChecker(PP.getDiagnostics()));
- ParseAST(PP, MainFileID, *C.get(), Stats);
+
+ case AnalysisLiveVariables:
+ Consumer = CreateLiveVarAnalyzer();
break;
- }
- case WarnDeadStoresCheck: {
- std::auto_ptr<ASTConsumer> C(CreateDeadStoreChecker(PP.getDiagnostics()));
- exit (CheckASTConsumer(PP, MainFileID, C));
+
+ case WarnDeadStores:
+ Consumer = CreateDeadStoreChecker(PP.getDiagnostics());
break;
- }
- case WarnUninitVals: {
- std::auto_ptr<ASTConsumer> C(CreateUnitValsChecker(PP.getDiagnostics()));
- ParseAST(PP, MainFileID, *C.get(), Stats);
+ case WarnUninitVals:
+ Consumer = CreateUnitValsChecker(PP.getDiagnostics());
break;
- }
- case EmitLLVM: {
- std::auto_ptr<ASTConsumer> C(CreateLLVMEmitter(PP.getDiagnostics()));
- ParseAST(PP, MainFileID, *C.get(), Stats);
+
+ case EmitLLVM:
+ Consumer = CreateLLVMEmitter(PP.getDiagnostics());
break;
}
- case ParseASTCheck:
- exit(CheckDiagnostics(PP, MainFileID));
- break;
+
+ if (Consumer) {
+ if (PerformDiagnosticsCheck)
+ exit (CheckASTConsumer(PP, MainFileID, Consumer));
+ else
+ ParseAST(PP, MainFileID, *Consumer, Stats);
+
+ delete Consumer;
}
if (Stats) {
diff --git a/Driver/clang.h b/Driver/clang.h
index 69b84431f4..e4ae3b87bf 100644
--- a/Driver/clang.h
+++ b/Driver/clang.h
@@ -40,12 +40,9 @@ TargetInfo *CreateTargetInfo(Diagnostic &Diags);
void EmitLLVMFromASTs(Preprocessor &PP, unsigned MainFileID,
bool PrintStats);
-/// CheckDiagnostics - Implement the -parse-ast-check diagnostic verifier.
-bool CheckDiagnostics(Preprocessor &PP, unsigned MainFileID);
-
/// CheckASTConsumer - Implement diagnostic checking for AST consumers.
-bool CheckASTConsumer(Preprocessor &PP, unsigned MainFileID,
- std::auto_ptr<ASTConsumer> C);
+bool CheckASTConsumer(Preprocessor &PP, unsigned MainFileID, ASTConsumer* C);
+
} // end namespace clang