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;
"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",
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.
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");
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) {