diff options
Diffstat (limited to 'include/clang/Frontend')
-rw-r--r-- | include/clang/Frontend/ASTConsumers.h | 8 | ||||
-rw-r--r-- | include/clang/Frontend/ASTUnit.h | 42 | ||||
-rw-r--r-- | include/clang/Frontend/Analyses.def | 4 | ||||
-rw-r--r-- | include/clang/Frontend/AnalyzerOptions.h | 2 | ||||
-rw-r--r-- | include/clang/Frontend/CodeGenOptions.h | 180 | ||||
-rw-r--r-- | include/clang/Frontend/CompilerInstance.h | 3 | ||||
-rw-r--r-- | include/clang/Frontend/CompilerInvocation.h | 42 | ||||
-rw-r--r-- | include/clang/Frontend/DiagnosticOptions.h | 3 | ||||
-rw-r--r-- | include/clang/Frontend/DiagnosticRenderer.h | 34 | ||||
-rw-r--r-- | include/clang/Frontend/FrontendAction.h | 2 | ||||
-rw-r--r-- | include/clang/Frontend/FrontendActions.h | 6 | ||||
-rw-r--r-- | include/clang/Frontend/FrontendOptions.h | 20 | ||||
-rw-r--r-- | include/clang/Frontend/HeaderSearchOptions.h | 28 | ||||
-rw-r--r-- | include/clang/Frontend/LangStandards.def | 6 | ||||
-rw-r--r-- | include/clang/Frontend/PreprocessorOutputOptions.h | 4 | ||||
-rw-r--r-- | include/clang/Frontend/TextDiagnostic.h | 26 | ||||
-rw-r--r-- | include/clang/Frontend/TextDiagnosticPrinter.h | 2 | ||||
-rw-r--r-- | include/clang/Frontend/VerifyDiagnosticConsumer.h | 138 |
18 files changed, 382 insertions, 168 deletions
diff --git a/include/clang/Frontend/ASTConsumers.h b/include/clang/Frontend/ASTConsumers.h index cef9509..3731478 100644 --- a/include/clang/Frontend/ASTConsumers.h +++ b/include/clang/Frontend/ASTConsumers.h @@ -33,11 +33,15 @@ class TargetOptions; // original C code. The output is intended to be in a format such that // clang could re-parse the output back into the same AST, but the // implementation is still incomplete. -ASTConsumer *CreateASTPrinter(raw_ostream *OS); +ASTConsumer *CreateASTPrinter(raw_ostream *OS, StringRef FilterString); // AST dumper: dumps the raw AST in human-readable form to stderr; this is // intended for debugging. -ASTConsumer *CreateASTDumper(); +ASTConsumer *CreateASTDumper(StringRef FilterString); + +// AST Decl node lister: prints qualified names of all filterable AST Decl +// nodes. +ASTConsumer *CreateASTDeclNodeLister(); // AST XML-dumper: dumps out the AST to stderr in a very detailed XML // format; this is intended for particularly intense debugging. diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 041eabb..144b796 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -19,6 +19,7 @@ #include "clang/Sema/CodeCompleteConsumer.h" #include "clang/Lex/ModuleLoader.h" #include "clang/Lex/PreprocessingRecord.h" +#include "clang/AST/ASTContext.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/FileManager.h" @@ -248,7 +249,15 @@ private: std::vector<serialization::DeclID> TopLevelDeclsInPreamble; /// \brief Whether we should be caching code-completion results. - bool ShouldCacheCodeCompletionResults; + bool ShouldCacheCodeCompletionResults : 1; + + /// \brief Whether to include brief documentation within the set of code + /// completions cached. + bool IncludeBriefCommentsInCodeCompletion : 1; + + /// \brief True if non-system source files should be treated as volatile + /// (likely to change while trying to use them). + bool UserFilesAreVolatile : 1; /// \brief The language options used when we load an AST file. LangOptions ASTFileLangOpts; @@ -275,12 +284,11 @@ public: /// \brief A bitmask that indicates which code-completion contexts should /// contain this completion result. /// - /// The bits in the bitmask correspond to the values of - /// CodeCompleteContext::Kind. To map from a completion context kind to a - /// bit, subtract one from the completion context kind and shift 1 by that - /// number of bits. Many completions can occur in several different - /// contexts. - unsigned ShowInContexts; + /// The bits in the bitmask correspond to the values of + /// CodeCompleteContext::Kind. To map from a completion context kind to a + /// bit, shift 1 by that number of bits. Many completions can occur in + /// several different contexts. + uint64_t ShowInContexts; /// \brief The priority given to this code-completion result. unsigned Priority; @@ -396,7 +404,9 @@ private: /// just about any usage. /// Becomes a noop in release mode; only useful for debug mode checking. class ConcurrencyState { +#ifndef NDEBUG void *Mutex; // a llvm::sys::MutexImpl in debug; +#endif public: ConcurrencyState(); @@ -612,7 +622,8 @@ public: /// \brief Create a ASTUnit. Gets ownership of the passed CompilerInvocation. static ASTUnit *create(CompilerInvocation *CI, IntrusiveRefCntPtr<DiagnosticsEngine> Diags, - bool CaptureDiagnostics = false); + bool CaptureDiagnostics, + bool UserFilesAreVolatile); /// \brief Create a ASTUnit from an AST file. /// @@ -629,7 +640,8 @@ public: RemappedFile *RemappedFiles = 0, unsigned NumRemappedFiles = 0, bool CaptureDiagnostics = false, - bool AllowPCHWithCompilerErrors = false); + bool AllowPCHWithCompilerErrors = false, + bool UserFilesAreVolatile = false); private: /// \brief Helper function for \c LoadFromCompilerInvocation() and @@ -679,6 +691,8 @@ public: bool CaptureDiagnostics = false, bool PrecompilePreamble = false, bool CacheCodeCompletionResults = false, + bool IncludeBriefCommentsInCodeCompletion = false, + bool UserFilesAreVolatile = false, OwningPtr<ASTUnit> *ErrAST = 0); /// LoadFromCompilerInvocation - Create an ASTUnit from a source file, via a @@ -698,7 +712,9 @@ public: bool CaptureDiagnostics = false, bool PrecompilePreamble = false, TranslationUnitKind TUKind = TU_Complete, - bool CacheCodeCompletionResults = false); + bool CacheCodeCompletionResults = false, + bool IncludeBriefCommentsInCodeCompletion = false, + bool UserFilesAreVolatile = false); /// LoadFromCommandLine - Create an ASTUnit from a vector of command line /// arguments, which must specify exactly one source file. @@ -730,8 +746,10 @@ public: bool PrecompilePreamble = false, TranslationUnitKind TUKind = TU_Complete, bool CacheCodeCompletionResults = false, + bool IncludeBriefCommentsInCodeCompletion = false, bool AllowPCHWithCompilerErrors = false, bool SkipFunctionBodies = false, + bool UserFilesAreVolatile = false, OwningPtr<ASTUnit> *ErrAST = 0); /// \brief Reparse the source files using the same command-line options that @@ -757,11 +775,15 @@ public: /// \param IncludeCodePatterns Whether to include code patterns (such as a /// for loop) in the code-completion results. /// + /// \param IncludeBriefComments Whether to include brief documentation within + /// the set of code completions returned. + /// /// FIXME: The Diag, LangOpts, SourceMgr, FileMgr, StoredDiagnostics, and /// OwnedBuffers parameters are all disgusting hacks. They will go away. void CodeComplete(StringRef File, unsigned Line, unsigned Column, RemappedFile *RemappedFiles, unsigned NumRemappedFiles, bool IncludeMacros, bool IncludeCodePatterns, + bool IncludeBriefComments, CodeCompleteConsumer &Consumer, DiagnosticsEngine &Diag, LangOptions &LangOpts, SourceManager &SourceMgr, FileManager &FileMgr, diff --git a/include/clang/Frontend/Analyses.def b/include/clang/Frontend/Analyses.def index b5b9394..29ddc9e 100644 --- a/include/clang/Frontend/Analyses.def +++ b/include/clang/Frontend/Analyses.def @@ -47,7 +47,9 @@ ANALYSIS_PURGE(PurgeNone, "none", "Do not purge symbols, bindings, or constrain #endif ANALYSIS_IPA(None, "none", "Perform only intra-procedural analysis") -ANALYSIS_IPA(Inlining, "inlining", "Experimental: Inline callees when their definitions are available") +ANALYSIS_IPA(Inlining, "inlining", "Inline callees when their definitions are available") +ANALYSIS_IPA(DynamicDispatch, "dynamic", "Experimental: Enable inlining of dynamically dispatched methods") +ANALYSIS_IPA(DynamicDispatchBifurcate, "dynamic-bifurcate", "Experimental: Enable inlining of dynamically dispatched methods, bifurcate paths when exact type info is unavailable") #ifndef ANALYSIS_INLINING_MODE #define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) diff --git a/include/clang/Frontend/AnalyzerOptions.h b/include/clang/Frontend/AnalyzerOptions.h index 847bfbd..4e489fe 100644 --- a/include/clang/Frontend/AnalyzerOptions.h +++ b/include/clang/Frontend/AnalyzerOptions.h @@ -96,7 +96,6 @@ public: unsigned VisualizeEGUbi : 1; unsigned UnoptimizedCFG : 1; unsigned CFGAddImplicitDtors : 1; - unsigned CFGAddInitializers : 1; unsigned EagerlyTrimEGraph : 1; unsigned PrintStats : 1; unsigned NoRetryExhausted : 1; @@ -121,7 +120,6 @@ public: VisualizeEGUbi = 0; UnoptimizedCFG = 0; CFGAddImplicitDtors = 0; - CFGAddInitializers = 0; EagerlyTrimEGraph = 0; PrintStats = 0; NoRetryExhausted = 0; diff --git a/include/clang/Frontend/CodeGenOptions.h b/include/clang/Frontend/CodeGenOptions.h index e844f88..3e34093 100644 --- a/include/clang/Frontend/CodeGenOptions.h +++ b/include/clang/Frontend/CodeGenOptions.h @@ -35,84 +35,101 @@ public: Mixed = 2 }; - unsigned AsmVerbose : 1; /// -dA, -fverbose-asm. - unsigned ObjCAutoRefCountExceptions : 1; /// Whether ARC should be EH-safe. - unsigned CUDAIsDevice : 1; /// Set when compiling for CUDA device. - unsigned CXAAtExit : 1; /// Use __cxa_atexit for calling destructors. - unsigned CXXCtorDtorAliases: 1; /// Emit complete ctors/dtors as linker - /// aliases to base ctors when possible. - unsigned DataSections : 1; /// Set when -fdata-sections is enabled - unsigned DebugInfo : 1; /// Should generate debug info (-g). - unsigned LimitDebugInfo : 1; /// Limit generated debug info to reduce size. - unsigned DisableFPElim : 1; /// Set when -fomit-frame-pointer is enabled. - unsigned DisableLLVMOpts : 1; /// Don't run any optimizations, for use in - /// getting .bc files that correspond to the - /// internal state before optimizations are - /// done. - unsigned DisableRedZone : 1; /// Set when -mno-red-zone is enabled. - unsigned DisableTailCalls : 1; /// Do not emit tail calls. - unsigned EmitDeclMetadata : 1; /// Emit special metadata indicating what - /// Decl* various IR entities came from. Only - /// useful when running CodeGen as a - /// subroutine. - unsigned EmitGcovArcs : 1; /// Emit coverage data files, aka. GCDA. - unsigned EmitGcovNotes : 1; /// Emit coverage "notes" files, aka GCNO. - unsigned ForbidGuardVariables : 1; /// Issue errors if C++ guard variables - /// are required - unsigned FunctionSections : 1; /// Set when -ffunction-sections is enabled - unsigned HiddenWeakTemplateVTables : 1; /// Emit weak vtables and RTTI for - /// template classes with hidden visibility - unsigned HiddenWeakVTables : 1; /// Emit weak vtables, RTTI, and thunks with - /// hidden visibility. - unsigned InstrumentFunctions : 1; /// Set when -finstrument-functions is - /// enabled. - unsigned InstrumentForProfiling : 1; /// Set when -pg is enabled - unsigned LessPreciseFPMAD : 1; /// Enable less precise MAD instructions to be - /// generated. - unsigned MergeAllConstants : 1; /// Merge identical constants. - unsigned NoCommon : 1; /// Set when -fno-common or C++ is enabled. - unsigned NoDwarf2CFIAsm : 1; /// Set when -fno-dwarf2-cfi-asm is enabled. - unsigned NoDwarfDirectoryAsm : 1; /// Set when -fno-dwarf-directory-asm is - /// enabled. - unsigned NoExecStack : 1; /// Set when -Wa,--noexecstack is enabled. - unsigned NoGlobalMerge : 1; /// Set when -mno-global-merge is enabled. - unsigned NoImplicitFloat : 1; /// Set when -mno-implicit-float is enabled. - unsigned NoInfsFPMath : 1; /// Assume FP arguments, results not +-Inf. - unsigned NoInline : 1; /// Set when -fno-inline is enabled. Disables - /// use of the inline keyword. - unsigned NoNaNsFPMath : 1; /// Assume FP arguments, results not NaN. - unsigned NoZeroInitializedInBSS : 1; /// -fno-zero-initialized-in-bss - unsigned ObjCDispatchMethod : 2; /// Method of Objective-C dispatch to use. - unsigned ObjCRuntimeHasARC : 1; /// The target runtime supports ARC natively - unsigned ObjCRuntimeHasTerminate : 1; /// The ObjC runtime has objc_terminate - unsigned OmitLeafFramePointer : 1; /// Set when -momit-leaf-frame-pointer is - /// enabled. - unsigned OptimizationLevel : 3; /// The -O[0-4] option specified. - unsigned OptimizeSize : 2; /// If -Os (==1) or -Oz (==2) is specified. - unsigned RelaxAll : 1; /// Relax all machine code instructions. - unsigned RelaxedAliasing : 1; /// Set when -fno-strict-aliasing is enabled. - unsigned SaveTempLabels : 1; /// Save temporary labels. - unsigned SimplifyLibCalls : 1; /// Set when -fbuiltin is enabled. - unsigned SoftFloat : 1; /// -soft-float. - unsigned StrictEnums : 1; /// Optimize based on strict enum definition. - unsigned TimePasses : 1; /// Set when -ftime-report is enabled. - unsigned UnitAtATime : 1; /// Unused. For mirroring GCC optimization - /// selection. - unsigned UnrollLoops : 1; /// Control whether loops are unrolled. - unsigned UnsafeFPMath : 1; /// Allow unsafe floating point optzns. - unsigned UnwindTables : 1; /// Emit unwind tables. + enum DebugInfoKind { + NoDebugInfo, // Don't generate debug info. + DebugLineTablesOnly, // Emit only debug info necessary for generating + // line number tables (-gline-tables-only). + LimitedDebugInfo, // Limit generated debug info to reduce size + // (-flimit-debug-info). + FullDebugInfo // Generate complete debug info. + }; + + enum TLSModel { + GeneralDynamicTLSModel, + LocalDynamicTLSModel, + InitialExecTLSModel, + LocalExecTLSModel + }; + + unsigned AsmVerbose : 1; ///< -dA, -fverbose-asm. + unsigned ObjCAutoRefCountExceptions : 1; ///< Whether ARC should be EH-safe. + unsigned CUDAIsDevice : 1; ///< Set when compiling for CUDA device. + unsigned CXAAtExit : 1; ///< Use __cxa_atexit for calling destructors. + unsigned CXXCtorDtorAliases: 1; ///< Emit complete ctors/dtors as linker + ///< aliases to base ctors when possible. + unsigned DataSections : 1; ///< Set when -fdata-sections is enabled. + unsigned DisableFPElim : 1; ///< Set when -fomit-frame-pointer is enabled. + unsigned DisableLLVMOpts : 1; ///< Don't run any optimizations, for use in + ///< getting .bc files that correspond to the + ///< internal state before optimizations are + ///< done. + unsigned DisableRedZone : 1; ///< Set when -mno-red-zone is enabled. + unsigned DisableTailCalls : 1; ///< Do not emit tail calls. + unsigned EmitDeclMetadata : 1; ///< Emit special metadata indicating what + ///< Decl* various IR entities came from. Only + ///< useful when running CodeGen as a + ///< subroutine. + unsigned EmitGcovArcs : 1; ///< Emit coverage data files, aka. GCDA. + unsigned EmitGcovNotes : 1; ///< Emit coverage "notes" files, aka GCNO. + unsigned EmitOpenCLArgMetadata : 1; ///< Emit OpenCL kernel arg metadata. + unsigned EmitMicrosoftInlineAsm : 1; ///< Enable emission of MS-style inline + ///< assembly. + unsigned ForbidGuardVariables : 1; ///< Issue errors if C++ guard variables + ///< are required. + unsigned FunctionSections : 1; ///< Set when -ffunction-sections is enabled. + unsigned HiddenWeakTemplateVTables : 1; ///< Emit weak vtables and RTTI for + ///< template classes with hidden visibility + unsigned HiddenWeakVTables : 1; ///< Emit weak vtables, RTTI, and thunks with + ///< hidden visibility. + unsigned InstrumentFunctions : 1; ///< Set when -finstrument-functions is + ///< enabled. + unsigned InstrumentForProfiling : 1; ///< Set when -pg is enabled. + unsigned LessPreciseFPMAD : 1; ///< Enable less precise MAD instructions to + ///< be generated. + unsigned MergeAllConstants : 1; ///< Merge identical constants. + unsigned NoCommon : 1; ///< Set when -fno-common or C++ is enabled. + unsigned NoDwarf2CFIAsm : 1; ///< Set when -fno-dwarf2-cfi-asm is enabled. + unsigned NoDwarfDirectoryAsm : 1; ///< Set when -fno-dwarf-directory-asm is + ///< enabled. + unsigned NoExecStack : 1; ///< Set when -Wa,--noexecstack is enabled. + unsigned NoGlobalMerge : 1; ///< Set when -mno-global-merge is enabled. + unsigned NoImplicitFloat : 1; ///< Set when -mno-implicit-float is enabled. + unsigned NoInfsFPMath : 1; ///< Assume FP arguments, results not +-Inf. + unsigned NoInline : 1; ///< Set when -fno-inline is enabled. Disables + ///< use of the inline keyword. + unsigned NoNaNsFPMath : 1; ///< Assume FP arguments, results not NaN. + unsigned NoZeroInitializedInBSS : 1; ///< -fno-zero-initialized-in-bss. + unsigned ObjCDispatchMethod : 2; ///< Method of Objective-C dispatch to use. + unsigned OmitLeafFramePointer : 1; ///< Set when -momit-leaf-frame-pointer is + ///< enabled. + unsigned OptimizationLevel : 3; ///< The -O[0-4] option specified. + unsigned OptimizeSize : 2; ///< If -Os (==1) or -Oz (==2) is specified. + unsigned RelaxAll : 1; ///< Relax all machine code instructions. + unsigned RelaxedAliasing : 1; ///< Set when -fno-strict-aliasing is enabled. + unsigned SaveTempLabels : 1; ///< Save temporary labels. + unsigned SimplifyLibCalls : 1; ///< Set when -fbuiltin is enabled. + unsigned SoftFloat : 1; ///< -soft-float. + unsigned StrictEnums : 1; ///< Optimize based on strict enum definition. + unsigned TimePasses : 1; ///< Set when -ftime-report is enabled. + unsigned UnitAtATime : 1; ///< Unused. For mirroring GCC optimization + ///< selection. + unsigned UnrollLoops : 1; ///< Control whether loops are unrolled. + unsigned UnsafeFPMath : 1; ///< Allow unsafe floating point optzns. + unsigned UnwindTables : 1; ///< Emit unwind tables. /// Attempt to use register sized accesses to bit-fields in structures, when /// possible. unsigned UseRegisterSizedBitfieldAccess : 1; - unsigned VerifyModule : 1; /// Control whether the module should be run - /// through the LLVM Verifier. + unsigned VerifyModule : 1; ///< Control whether the module should be run + ///< through the LLVM Verifier. - unsigned StackRealignment : 1; /// Control whether to permit stack - /// realignment. - unsigned StackAlignment; /// Overrides default stack alignment, - /// if not 0. + unsigned StackRealignment : 1; ///< Control whether to permit stack + ///< realignment. + unsigned UseInitArray : 1; ///< Control whether to use .init_array or + ///< .ctors. + unsigned StackAlignment; ///< Overrides default stack alignment, + ///< if not 0. /// The code model to use (-mcmodel). std::string CodeModel; @@ -127,6 +144,9 @@ public: /// The string to embed in debug information as the current working directory. std::string DebugCompilationDir; + /// The kind of generated debug info. + DebugInfoKind DebugInfo; + /// The string to embed in the debug information for the compile unit, if /// non-empty. std::string DwarfDebugFlags; @@ -162,6 +182,12 @@ public: /// or 0 if unspecified. unsigned NumRegisterParameters; + /// The run-time penalty for bounds checking, or 0 to disable. + unsigned char BoundsChecking; + + /// The default TLS model to use. + TLSModel DefaultTLSModel; + public: CodeGenOptions() { AsmVerbose = 0; @@ -169,8 +195,6 @@ public: CXAAtExit = 1; CXXCtorDtorAliases = 0; DataSections = 0; - DebugInfo = 0; - LimitDebugInfo = 0; DisableFPElim = 0; DisableLLVMOpts = 0; DisableRedZone = 0; @@ -178,6 +202,8 @@ public: EmitDeclMetadata = 0; EmitGcovArcs = 0; EmitGcovNotes = 0; + EmitOpenCLArgMetadata = 0; + EmitMicrosoftInlineAsm = 0; ForbidGuardVariables = 0; FunctionSections = 0; HiddenWeakTemplateVTables = 0; @@ -196,8 +222,6 @@ public: NumRegisterParameters = 0; ObjCAutoRefCountExceptions = 0; ObjCDispatchMethod = Legacy; - ObjCRuntimeHasARC = 0; - ObjCRuntimeHasTerminate = 0; OmitLeafFramePointer = 0; OptimizationLevel = 0; OptimizeSize = 0; @@ -216,9 +240,13 @@ public: VerifyModule = 1; StackRealignment = 0; StackAlignment = 0; + BoundsChecking = 0; + UseInitArray = 0; + DebugInfo = NoDebugInfo; Inlining = NoInlining; RelocationModel = "pic"; + DefaultTLSModel = GeneralDynamicTLSModel; } ObjCDispatchMethodKind getObjCDispatchMethod() const { diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index 1bb7695..b28e103 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -560,8 +560,7 @@ public: static CodeCompleteConsumer * createCodeCompletionConsumer(Preprocessor &PP, const std::string &Filename, unsigned Line, unsigned Column, - bool ShowMacros, - bool ShowCodePatterns, bool ShowGlobals, + const CodeCompleteOptions &Opts, raw_ostream &OS); /// \brief Create the Sema object to be used for parsing. diff --git a/include/clang/Frontend/CompilerInvocation.h b/include/clang/Frontend/CompilerInvocation.h index 0d2260a..d6fe003 100644 --- a/include/clang/Frontend/CompilerInvocation.h +++ b/include/clang/Frontend/CompilerInvocation.h @@ -38,10 +38,13 @@ namespace driver { class ArgList; } -/// CompilerInvocation - Fill out Opts based on the options given in Args. +/// \brief Fill out Opts based on the options given in Args. +/// /// Args must have been created from the OptTable returned by -/// createCC1OptTable(). When errors are encountered, return false and, -/// if Diags is non-null, report the error(s). +/// createCC1OptTable(). +/// +/// When errors are encountered, return false and, if Diags is non-null, +/// report the error(s). bool ParseDiagnosticArgs(DiagnosticOptions &Opts, driver::ArgList &Args, DiagnosticsEngine *Diags = 0); @@ -58,8 +61,7 @@ public: const LangOptions *getLangOpts() const { return LangOpts.getPtr(); } }; -/// CompilerInvocation - Helper class for holding the data necessary to invoke -/// the compiler. +/// \brief Helper class for holding the data necessary to invoke the compiler. /// /// This class is designed to represent an abstract "invocation" of the /// compiler, including data such as the include paths, the code generation @@ -85,10 +87,10 @@ class CompilerInvocation : public CompilerInvocationBase { /// Options controlling the frontend itself. FrontendOptions FrontendOpts; - /// Options controlling the #include directive. + /// Options controlling the \#include directive. HeaderSearchOptions HeaderSearchOpts; - /// Options controlling the preprocessor (aside from #include handling). + /// Options controlling the preprocessor (aside from \#include handling). PreprocessorOptions PreprocessorOpts; /// Options controlling preprocessed output. @@ -103,10 +105,10 @@ public: /// @name Utility Methods /// @{ - /// CreateFromArgs - Create a compiler invocation from a list of input - /// options. Returns true on success. + /// \brief Create a compiler invocation from a list of input options. + /// \returns true on success. /// - /// \param Res [out] - The resulting invocation. + /// \param [out] Res - The resulting invocation. /// \param ArgBegin - The first element in the argument vector. /// \param ArgEnd - The last element in the argument vector. /// \param Diags - The diagnostic engine to use for errors. @@ -115,7 +117,7 @@ public: const char* const *ArgEnd, DiagnosticsEngine &Diags); - /// GetBuiltinIncludePath - Get the directory where the compiler headers + /// \brief Get the directory where the compiler headers /// reside, relative to the compiler binary (found by the passed in /// arguments). /// @@ -125,24 +127,14 @@ public: /// executable), for finding the builtin compiler path. static std::string GetResourcesPath(const char *Argv0, void *MainAddr); - /// toArgs - Convert the CompilerInvocation to a list of strings suitable for + /// \brief Convert the CompilerInvocation to a list of strings suitable for /// passing to CreateFromArgs. - void toArgs(std::vector<std::string> &Res); - - /// setLangDefaults - Set language defaults for the given input language and - /// language standard in this CompilerInvocation. - /// - /// \param IK - The input language. - /// \param LangStd - The input language standard. - void setLangDefaults(InputKind IK, - LangStandard::Kind LangStd = LangStandard::lang_unspecified) { - setLangDefaults(*getLangOpts(), IK, LangStd); - } + void toArgs(std::vector<std::string> &Res) const; - /// setLangDefaults - Set language defaults for the given input language and + /// \brief Set language defaults for the given input language and /// language standard in the given LangOptions object. /// - /// \param LangOpts - The LangOptions object to set up. + /// \param Opts - The LangOptions object to set up. /// \param IK - The input language. /// \param LangStd - The input language standard. static void setLangDefaults(LangOptions &Opts, InputKind IK, diff --git a/include/clang/Frontend/DiagnosticOptions.h b/include/clang/Frontend/DiagnosticOptions.h index 1c6ba6a..8dec37c 100644 --- a/include/clang/Frontend/DiagnosticOptions.h +++ b/include/clang/Frontend/DiagnosticOptions.h @@ -47,6 +47,9 @@ public: /// diagnostics, indicated by markers in the /// input source file. + unsigned ElideType: 1; /// Elide identical types in template diffing + unsigned ShowTemplateTree: 1; /// Print a template tree when diffing + unsigned ErrorLimit; /// Limit # errors emitted. unsigned MacroBacktraceLimit; /// Limit depth of macro expansion backtrace. unsigned TemplateBacktraceLimit; /// Limit depth of instantiation backtrace. diff --git a/include/clang/Frontend/DiagnosticRenderer.h b/include/clang/Frontend/DiagnosticRenderer.h index 5ad88a8..09d7ecb 100644 --- a/include/clang/Frontend/DiagnosticRenderer.h +++ b/include/clang/Frontend/DiagnosticRenderer.h @@ -43,7 +43,6 @@ typedef llvm::PointerUnion<const Diagnostic *, /// class. class DiagnosticRenderer { protected: - const SourceManager &SM; const LangOptions &LangOpts; const DiagnosticOptions &DiagOpts; @@ -66,8 +65,7 @@ protected: /// which change the amount of information displayed. DiagnosticsEngine::Level LastLevel; - DiagnosticRenderer(const SourceManager &SM, - const LangOptions &LangOpts, + DiagnosticRenderer(const LangOptions &LangOpts, const DiagnosticOptions &DiagOpts); virtual ~DiagnosticRenderer(); @@ -76,20 +74,24 @@ protected: DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<CharSourceRange> Ranges, + const SourceManager *SM, DiagOrStoredDiag Info) = 0; virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, - ArrayRef<CharSourceRange> Ranges) = 0; + ArrayRef<CharSourceRange> Ranges, + const SourceManager &SM) = 0; virtual void emitBasicNote(StringRef Message) = 0; virtual void emitCodeContext(SourceLocation Loc, DiagnosticsEngine::Level Level, SmallVectorImpl<CharSourceRange>& Ranges, - ArrayRef<FixItHint> Hints) = 0; + ArrayRef<FixItHint> Hints, + const SourceManager &SM) = 0; - virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc) = 0; + virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc, + const SourceManager &SM) = 0; virtual void beginDiagnostic(DiagOrStoredDiag D, DiagnosticsEngine::Level Level) {} @@ -98,12 +100,14 @@ protected: private: - void emitIncludeStack(SourceLocation Loc, DiagnosticsEngine::Level Level); - void emitIncludeStackRecursively(SourceLocation Loc); + void emitIncludeStack(SourceLocation Loc, DiagnosticsEngine::Level Level, + const SourceManager &SM); + void emitIncludeStackRecursively(SourceLocation Loc, const SourceManager &SM); void emitMacroExpansionsAndCarets(SourceLocation Loc, DiagnosticsEngine::Level Level, SmallVectorImpl<CharSourceRange>& Ranges, ArrayRef<FixItHint> Hints, + const SourceManager &SM, unsigned &MacroDepth, unsigned OnMacroInst = 0); public: @@ -119,9 +123,12 @@ public: /// \param Message The diagnostic message to emit. /// \param Ranges The underlined ranges for this code snippet. /// \param FixItHints The FixIt hints active for this diagnostic. + /// \param SM The SourceManager; will be null if the diagnostic came from the + /// frontend, thus \param Loc will be invalid. void emitDiagnostic(SourceLocation Loc, DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<CharSourceRange> Ranges, ArrayRef<FixItHint> FixItHints, + const SourceManager *SM, DiagOrStoredDiag D = (Diagnostic *)0); void emitStoredDiagnostic(StoredDiagnostic &Diag); @@ -131,19 +138,20 @@ public: /// notes. It is up to subclasses to further define the behavior. class DiagnosticNoteRenderer : public DiagnosticRenderer { public: - DiagnosticNoteRenderer(const SourceManager &SM, - const LangOptions &LangOpts, + DiagnosticNoteRenderer(const LangOptions &LangOpts, const DiagnosticOptions &DiagOpts) - : DiagnosticRenderer(SM, LangOpts, DiagOpts) {} + : DiagnosticRenderer(LangOpts, DiagOpts) {} virtual ~DiagnosticNoteRenderer(); virtual void emitBasicNote(StringRef Message); virtual void emitIncludeLocation(SourceLocation Loc, - PresumedLoc PLoc); + PresumedLoc PLoc, + const SourceManager &SM); - virtual void emitNote(SourceLocation Loc, StringRef Message) = 0; + virtual void emitNote(SourceLocation Loc, StringRef Message, + const SourceManager *SM) = 0; }; } // end clang namespace #endif diff --git a/include/clang/Frontend/FrontendAction.h b/include/clang/Frontend/FrontendAction.h index 6839028..c0056de 100644 --- a/include/clang/Frontend/FrontendAction.h +++ b/include/clang/Frontend/FrontendAction.h @@ -188,7 +188,7 @@ public: bool BeginSourceFile(CompilerInstance &CI, const FrontendInputFile &Input); /// Execute - Set the source managers main input file, and run the action. - void Execute(); + bool Execute(); /// EndSourceFile - Perform any per-file post processing, deallocate per-file /// objects, and run statistics and output file cleanup code. diff --git a/include/clang/Frontend/FrontendActions.h b/include/clang/Frontend/FrontendActions.h index 8f7fe87..477ac45 100644 --- a/include/clang/Frontend/FrontendActions.h +++ b/include/clang/Frontend/FrontendActions.h @@ -50,6 +50,12 @@ protected: StringRef InFile); }; +class ASTDeclListAction : public ASTFrontendAction { +protected: + virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, + StringRef InFile); +}; + class ASTDumpXMLAction : public ASTFrontendAction { protected: virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, diff --git a/include/clang/Frontend/FrontendOptions.h b/include/clang/Frontend/FrontendOptions.h index 888388c..ce1cd9b 100644 --- a/include/clang/Frontend/FrontendOptions.h +++ b/include/clang/Frontend/FrontendOptions.h @@ -11,6 +11,7 @@ #define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H #include "clang/Frontend/CommandLineSourceLoc.h" +#include "clang/Sema/CodeCompleteOptions.h" #include "llvm/ADT/StringRef.h" #include <string> #include <vector> @@ -19,6 +20,7 @@ namespace clang { namespace frontend { enum ActionKind { + ASTDeclList, ///< Parse ASTs and list Decl nodes. ASTDump, ///< Parse ASTs and dump them. ASTDumpXML, ///< Parse ASTs and dump them in XML. ASTPrint, ///< Parse ASTs and print them. @@ -42,7 +44,7 @@ namespace frontend { PrintDeclContext, ///< Print DeclContext and their Decls. PrintPreamble, ///< Print the "preamble" of the input file PrintPreprocessedInput, ///< -E mode. - RewriteMacros, ///< Expand macros but not #includes. + RewriteMacros, ///< Expand macros but not \#includes. RewriteObjC, ///< ObjC->C Rewriter. RewriteTest, ///< Rewriter playground RunAnalysis, ///< Run one or more source code analyses. @@ -84,7 +86,7 @@ struct FrontendInputFile { FrontendInputFile(StringRef File, InputKind Kind, bool IsSystem = false) : File(File.str()), Kind(Kind), IsSystem(IsSystem) { } }; - + /// FrontendOptions - Options for controlling the behavior of the frontend. class FrontendOptions { public: @@ -93,12 +95,6 @@ public: /// instruct the AST writer to create /// relocatable PCH files. unsigned ShowHelp : 1; ///< Show the -help text. - unsigned ShowMacrosInCodeCompletion : 1; ///< Show macros in code completion - /// results. - unsigned ShowCodePatternsInCodeCompletion : 1; ///< Show code patterns in code - /// completion results. - unsigned ShowGlobalSymbolsInCodeCompletion : 1; ///< Show top-level decls in - /// code completion results. unsigned ShowStats : 1; ///< Show frontend performance /// metrics and statistics. unsigned ShowTimers : 1; ///< Show timers for individual @@ -116,6 +112,8 @@ public: /// not need them (e.g. with code /// completion). + CodeCompleteOptions CodeCompleteOpts; + enum { ARCMT_None, ARCMT_Check, @@ -144,6 +142,9 @@ public: /// If given, the new suffix for fix-it rewritten files. std::string FixItSuffix; + /// If given, filter dumped AST Decl nodes by this substring. + std::string ASTDumpFilter; + /// If given, enable code completion at the provided location. ParsedSourceLocation CodeCompletionAt; @@ -183,9 +184,6 @@ public: ActionName = ""; RelocatablePCH = 0; ShowHelp = 0; - ShowMacrosInCodeCompletion = 0; - ShowCodePatternsInCodeCompletion = 0; - ShowGlobalSymbolsInCodeCompletion = 1; ShowStats = 0; ShowTimers = 0; ShowVersion = 0; diff --git a/include/clang/Frontend/HeaderSearchOptions.h b/include/clang/Frontend/HeaderSearchOptions.h index 687f439..ebc8f26 100644 --- a/include/clang/Frontend/HeaderSearchOptions.h +++ b/include/clang/Frontend/HeaderSearchOptions.h @@ -17,12 +17,12 @@ namespace clang { namespace frontend { /// IncludeDirGroup - Identifiers the group a include entry belongs to, which - /// represents its relative positive in the search list. A #include of a "" + /// represents its relative positive in the search list. A \#include of a "" /// path starts at the -iquote group, then searches the Angled group, then /// searches the system group, etc. enum IncludeDirGroup { - Quoted = 0, ///< '#include ""' paths, added by'gcc -iquote'. - Angled, ///< Paths for '#include <>' added by '-I'. + Quoted = 0, ///< '\#include ""' paths, added by 'gcc -iquote'. + Angled, ///< Paths for '\#include <>' added by '-I'. IndexHeaderMap, ///< Like Angled, but marks header maps used when /// building frameworks. System, ///< Like Angled, but marks system directories. @@ -69,6 +69,18 @@ public: IsInternal(isInternal), ImplicitExternC(implicitExternC) {} }; + struct SystemHeaderPrefix { + /// A prefix to be matched against paths in \#include directives. + std::string Prefix; + + /// True if paths beginning with this prefix should be treated as system + /// headers. + bool IsSystemHeader; + + SystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader) + : Prefix(Prefix), IsSystemHeader(IsSystemHeader) {} + }; + /// If non-empty, the directory to use as a "virtual system root" for include /// paths. std::string Sysroot; @@ -76,6 +88,9 @@ public: /// User specified include entries. std::vector<Entry> UserEntries; + /// User-specified system header prefixes. + std::vector<SystemHeaderPrefix> SystemHeaderPrefixes; + /// The directory which holds the compiler resource files (builtin includes, /// etc.). std::string ResourceDir; @@ -117,6 +132,13 @@ public: UserEntries.push_back(Entry(Path, Group, IsUserSupplied, IsFramework, IgnoreSysRoot, IsInternal, ImplicitExternC)); } + + /// AddSystemHeaderPrefix - Override whether \#include directives naming a + /// path starting with \arg Prefix should be considered as naming a system + /// header. + void AddSystemHeaderPrefix(StringRef Prefix, bool IsSystemHeader) { + SystemHeaderPrefixes.push_back(SystemHeaderPrefix(Prefix, IsSystemHeader)); + } }; } // end namespace clang diff --git a/include/clang/Frontend/LangStandards.def b/include/clang/Frontend/LangStandards.def index 4bcff4a..a604d4b 100644 --- a/include/clang/Frontend/LangStandards.def +++ b/include/clang/Frontend/LangStandards.def @@ -111,6 +111,12 @@ LANGSTANDARD(gnucxx11, "gnu++11", LANGSTANDARD(opencl, "cl", "OpenCL 1.0", BCPLComment | C99 | Digraphs | HexFloat) +LANGSTANDARD(opencl11, "CL1.1", + "OpenCL 1.1", + BCPLComment | C99 | Digraphs | HexFloat) +LANGSTANDARD(opencl12, "CL1.2", + "OpenCL 1.2", + BCPLComment | C99 | Digraphs | HexFloat) // CUDA LANGSTANDARD(cuda, "cuda", diff --git a/include/clang/Frontend/PreprocessorOutputOptions.h b/include/clang/Frontend/PreprocessorOutputOptions.h index 1eda0d4..9793aa6 100644 --- a/include/clang/Frontend/PreprocessorOutputOptions.h +++ b/include/clang/Frontend/PreprocessorOutputOptions.h @@ -18,9 +18,10 @@ class PreprocessorOutputOptions { public: unsigned ShowCPP : 1; ///< Print normal preprocessed output. unsigned ShowComments : 1; ///< Show comments. - unsigned ShowLineMarkers : 1; ///< Show #line markers. + unsigned ShowLineMarkers : 1; ///< Show \#line markers. unsigned ShowMacroComments : 1; ///< Show comments, even in macros. unsigned ShowMacros : 1; ///< Print macro definitions. + unsigned RewriteIncludes : 1; ///< Preprocess include directives only. public: PreprocessorOutputOptions() { @@ -29,6 +30,7 @@ public: ShowLineMarkers = 1; ShowMacroComments = 0; ShowMacros = 0; + RewriteIncludes = 0; } }; diff --git a/include/clang/Frontend/TextDiagnostic.h b/include/clang/Frontend/TextDiagnostic.h index 314003b..c869c08 100644 --- a/include/clang/Frontend/TextDiagnostic.h +++ b/include/clang/Frontend/TextDiagnostic.h @@ -39,7 +39,6 @@ class TextDiagnostic : public DiagnosticRenderer { public: TextDiagnostic(raw_ostream &OS, - const SourceManager &SM, const LangOptions &LangOpts, const DiagnosticOptions &DiagOpts); @@ -60,7 +59,7 @@ public: /// /// This is a static helper to handle the line wrapping, colorizing, and /// rendering of a diagnostic message to a particular ostream. It is - /// publically visible so that clients which do not have sufficient state to + /// publicly visible so that clients which do not have sufficient state to /// build a complete TextDiagnostic object can still get consistent /// formatting of their diagnostic messages. /// @@ -83,39 +82,46 @@ protected: DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<CharSourceRange> Ranges, + const SourceManager *SM, DiagOrStoredDiag D); virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, - ArrayRef<CharSourceRange> Ranges); + ArrayRef<CharSourceRange> Ranges, + const SourceManager &SM); virtual void emitCodeContext(SourceLocation Loc, DiagnosticsEngine::Level Level, SmallVectorImpl<CharSourceRange>& Ranges, - ArrayRef<FixItHint> Hints) { - emitSnippetAndCaret(Loc, Level, Ranges, Hints); + ArrayRef<FixItHint> Hints, + const SourceManager &SM) { + emitSnippetAndCaret(Loc, Level, Ranges, Hints, SM); } virtual void emitBasicNote(StringRef Message); - virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc); + virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc, + const SourceManager &SM); private: void emitSnippetAndCaret(SourceLocation Loc, DiagnosticsEngine::Level Level, SmallVectorImpl<CharSourceRange>& Ranges, - ArrayRef<FixItHint> Hints); + ArrayRef<FixItHint> Hints, + const SourceManager &SM); void emitSnippet(StringRef SourceLine); void highlightRange(const CharSourceRange &R, unsigned LineNo, FileID FID, const SourceColumnMap &map, - std::string &CaretLine); + std::string &CaretLine, + const SourceManager &SM); std::string buildFixItInsertionLine(unsigned LineNo, const SourceColumnMap &map, - ArrayRef<FixItHint> Hints); - void emitParseableFixits(ArrayRef<FixItHint> Hints); + ArrayRef<FixItHint> Hints, + const SourceManager &SM); + void emitParseableFixits(ArrayRef<FixItHint> Hints, const SourceManager &SM); }; } // end namespace clang diff --git a/include/clang/Frontend/TextDiagnosticPrinter.h b/include/clang/Frontend/TextDiagnosticPrinter.h index 9b6ac24..23cf521 100644 --- a/include/clang/Frontend/TextDiagnosticPrinter.h +++ b/include/clang/Frontend/TextDiagnosticPrinter.h @@ -26,9 +26,7 @@ class TextDiagnostic; class TextDiagnosticPrinter : public DiagnosticConsumer { raw_ostream &OS; - const LangOptions *LangOpts; const DiagnosticOptions *DiagOpts; - const SourceManager *SM; /// \brief Handle to the currently active text diagnostic emitter. OwningPtr<TextDiagnostic> TextDiag; diff --git a/include/clang/Frontend/VerifyDiagnosticConsumer.h b/include/clang/Frontend/VerifyDiagnosticConsumer.h index 2fc6ccc..a74589e 100644 --- a/include/clang/Frontend/VerifyDiagnosticConsumer.h +++ b/include/clang/Frontend/VerifyDiagnosticConsumer.h @@ -11,12 +11,18 @@ #define LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICSCLIENT_H #include "clang/Basic/Diagnostic.h" +#include "clang/Lex/Preprocessor.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/STLExtras.h" +#include <climits> namespace clang { class DiagnosticsEngine; class TextDiagnosticBuffer; +class FileEntry; /// VerifyDiagnosticConsumer - Create a diagnostic client which will use /// markers in the input source to check that all the emitted diagnostics match @@ -35,18 +41,58 @@ class TextDiagnosticBuffer; /// /// Here's an example: /// +/// \code /// int A = B; // expected-error {{use of undeclared identifier 'B'}} +/// \endcode /// /// You can place as many diagnostics on one line as you wish. To make the code /// more readable, you can use slash-newline to separate out the diagnostics. /// +/// Alternatively, it is possible to specify the line on which the diagnostic +/// should appear by appending "@<line>" to "expected-<type>", for example: +/// +/// \code +/// #warning some text +/// // expected-warning@10 {{some text}} +/// \endcode +/// +/// The line number may be absolute (as above), or relative to the current +/// line by prefixing the number with either '+' or '-'. +/// /// The simple syntax above allows each specification to match exactly one /// error. You can use the extended syntax to customize this. The extended -/// syntax is "expected-<type> <n> {{diag text}}", where <type> is one of -/// "error", "warning" or "note", and <n> is a positive integer. This allows the -/// diagnostic to appear as many times as specified. Example: +/// syntax is "expected-<type> <n> {{diag text}}", where \<type> is one of +/// "error", "warning" or "note", and \<n> is a positive integer. This allows +/// the diagnostic to appear as many times as specified. Example: /// +/// \code /// void f(); // expected-note 2 {{previous declaration is here}} +/// \endcode +/// +/// Where the diagnostic is expected to occur a minimum number of times, this +/// can be specified by appending a '+' to the number. Example: +/// +/// \code +/// void f(); // expected-note 0+ {{previous declaration is here}} +/// void g(); // expected-note 1+ {{previous declaration is here}} +/// \endcode +/// +/// In the first example, the diagnostic becomes optional, i.e. it will be +/// swallowed if it occurs, but will not generate an error if it does not +/// occur. In the second example, the diagnostic must occur at least once. +/// As a short-hand, "one or more" can be specified simply by '+'. Example: +/// +/// \code +/// void g(); // expected-note + {{previous declaration is here}} +/// \endcode +/// +/// A range can also be specified by "<n>-<m>". Example: +/// +/// \code +/// void f(); // expected-note 0-1 {{previous declaration is here}} +/// \endcode +/// +/// In this example, the diagnostic may appear only once, if at all. /// /// Regex matching mode may be selected by appending '-re' to type. Example: /// @@ -62,20 +108,85 @@ class TextDiagnosticBuffer; /// // expected-error-re {{variable has has type 'struct (.*)'}} /// // expected-error-re {{variable has has type 'struct[[:space:]](.*)'}} /// -class VerifyDiagnosticConsumer: public DiagnosticConsumer { +class VerifyDiagnosticConsumer: public DiagnosticConsumer, + public CommentHandler { public: + /// Directive - Abstract class representing a parsed verify directive. + /// + class Directive { + public: + static Directive *create(bool RegexKind, SourceLocation DirectiveLoc, + SourceLocation DiagnosticLoc, + StringRef Text, unsigned Min, unsigned Max); + public: + /// Constant representing n or more matches. + static const unsigned MaxCount = UINT_MAX; + + SourceLocation DirectiveLoc; + SourceLocation DiagnosticLoc; + const std::string Text; + unsigned Min, Max; + + virtual ~Directive() { } + + // Returns true if directive text is valid. + // Otherwise returns false and populates E. + virtual bool isValid(std::string &Error) = 0; + + // Returns true on match. + virtual bool match(StringRef S) = 0; + + protected: + Directive(SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc, + StringRef Text, unsigned Min, unsigned Max) + : DirectiveLoc(DirectiveLoc), DiagnosticLoc(DiagnosticLoc), + Text(Text), Min(Min), Max(Max) { + assert(!DirectiveLoc.isInvalid() && "DirectiveLoc is invalid!"); + assert(!DiagnosticLoc.isInvalid() && "DiagnosticLoc is invalid!"); + } + + private: + Directive(const Directive&); // DO NOT IMPLEMENT + void operator=(const Directive&); // DO NOT IMPLEMENT + }; + + typedef std::vector<Directive*> DirectiveList; + + /// ExpectedData - owns directive objects and deletes on destructor. + /// + struct ExpectedData { + DirectiveList Errors; + DirectiveList Warnings; + DirectiveList Notes; + + ~ExpectedData() { + llvm::DeleteContainerPointers(Errors); + llvm::DeleteContainerPointers(Warnings); + llvm::DeleteContainerPointers(Notes); + } + }; + +#ifndef NDEBUG + typedef llvm::DenseSet<FileID> FilesWithDiagnosticsSet; + typedef llvm::SmallPtrSet<const FileEntry *, 4> FilesParsedForDirectivesSet; +#endif + +private: DiagnosticsEngine &Diags; DiagnosticConsumer *PrimaryClient; bool OwnsPrimaryClient; OwningPtr<TextDiagnosticBuffer> Buffer; - Preprocessor *CurrentPreprocessor; - -private: - FileID FirstErrorFID; // FileID of first diagnostic + const Preprocessor *CurrentPreprocessor; + unsigned ActiveSourceFiles; +#ifndef NDEBUG + FilesWithDiagnosticsSet FilesWithDiagnostics; + FilesParsedForDirectivesSet FilesParsedForDirectives; +#endif + ExpectedData ED; void CheckDiagnostics(); public: - /// Create a new verifying diagnostic client, which will issue errors to \arg + /// Create a new verifying diagnostic client, which will issue errors to /// the currently-attached diagnostic client when a diagnostic does not match /// what is expected (as indicated in the source file). VerifyDiagnosticConsumer(DiagnosticsEngine &Diags); @@ -86,6 +197,15 @@ public: virtual void EndSourceFile(); + /// \brief Manually register a file as parsed. + inline void appendParsedFile(const FileEntry *File) { +#ifndef NDEBUG + FilesParsedForDirectives.insert(File); +#endif + } + + virtual bool HandleComment(Preprocessor &PP, SourceRange Comment); + virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info); |