r207477 - Check -Werror options during module validation

Ben Langmuir blangmuir at apple.com
Tue Apr 29 09:34:43 PDT 2014


On Apr 29, 2014, at 6:00 AM, NAKAMURA Takumi <geek4civic at gmail.com> wrote:

> 2014-04-29 9:36 GMT+09:00 Ben Langmuir <blangmuir at apple.com>:
>> Author: benlangmuir
>> Date: Mon Apr 28 19:36:53 2014
>> New Revision: 207477
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=207477&view=rev
>> Log:
>> Check -Werror options during module validation
>> 
>> This patch checks whether the diagnostic options that could lead to
>> errors (principally -Werror) are consistent between when a module was
>> built and when it is loaded.  If there are new -Werror flags, then the
>> module is rebuilt.  In order to canonicalize the options we do this
>> check at the level of the constructed DiagnosticsEngine, which contains
>> the final set of diag to diagnostic level mappings.  Currently we only
>> rebuild with the new diagnostic options, but we intend to refine this in
>> the future to include the union of the new and old flags, since we know
>> the old ones did not cause errors.  System modules are only rebuilt when
>> -Wsystem-headers is enabled.
>> 
>> One oddity is that unlike checking language options, we don’t perform
>> this diagnostic option checking when loading from a precompiled header.
>> The reason for this is that the compiler cannot rebuild the PCH, so
>> anything that requires it to be rebuilt effectively leaks into the build
>> system.  And in this case, that would mean the build system
>> understanding the complex relationship between diagnostic options and
>> the underlying diagnostic mappings, which is unreasonable.  Skipping the
>> check is safe, because these options do not affect the generated AST.
>> You simply won’t get new build errors due to changed -Werror options
>> automatically, which is also true for non-module cases.
>> 
>> Added:
>>    cfe/trunk/test/Modules/Werror-Wsystem-headers.m
>>    cfe/trunk/test/Modules/Werror.m
>> Modified:
>>    cfe/trunk/include/clang/Basic/Diagnostic.h
>>    cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td
>>    cfe/trunk/include/clang/Serialization/ASTReader.h
>>    cfe/trunk/lib/Frontend/FrontendActions.cpp
>>    cfe/trunk/lib/Serialization/ASTReader.cpp
>>    cfe/trunk/test/Modules/module_file_info.m
>>    cfe/trunk/test/Modules/resolution-change.m
>> 
>> Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
>> +++ cfe/trunk/include/clang/Basic/Diagnostic.h Mon Apr 28 19:36:53 2014
>> @@ -21,6 +21,7 @@
>> #include "llvm/ADT/ArrayRef.h"
>> #include "llvm/ADT/DenseMap.h"
>> #include "llvm/ADT/IntrusiveRefCntPtr.h"
>> +#include "llvm/ADT/iterator_range.h"
>> #include <list>
>> #include <vector>
>> 
>> @@ -364,6 +365,14 @@ public:
>>   /// \brief Retrieve the diagnostic options.
>>   DiagnosticOptions &getDiagnosticOptions() const { return *DiagOpts; }
>> 
>> +  typedef llvm::iterator_range<DiagState::const_iterator> diag_mapping_range;
>> +
>> +  /// \brief Get the current set of diagnostic mappings.
>> +  diag_mapping_range getDiagnosticMappings() const {
>> +    const DiagState &DS = *GetCurDiagState();
>> +    return diag_mapping_range(DS.begin(), DS.end());
>> +  }
>> +
>>   DiagnosticConsumer *getClient() { return Client; }
>>   const DiagnosticConsumer *getClient() const { return Client; }
>> 
>> 
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td Mon Apr 28 19:36:53 2014
>> @@ -39,6 +39,8 @@ def err_pch_langopt_mismatch : Error<"%0
>>     "PCH file but is currently %select{disabled|enabled}2">;
>> def err_pch_langopt_value_mismatch : Error<
>>   "%0 differs in PCH file vs. current file">;
>> +def err_pch_diagopt_mismatch : Error<"%0 is currently enabled, but was not in "
>> +  "the PCH file">;
>> 
>> def err_pch_version_too_old : Error<
>>     "PCH file uses an older PCH format that is no longer supported">;
>> 
>> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
>> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Mon Apr 28 19:36:53 2014
>> @@ -133,8 +133,9 @@ public:
>>   ///
>>   /// \returns true to indicate the diagnostic options are invalid, or false
>>   /// otherwise.
>> -  virtual bool ReadDiagnosticOptions(const DiagnosticOptions &DiagOpts,
>> -                                     bool Complain) {
>> +  virtual bool
>> +  ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,
>> +                        bool Complain) {
>>     return false;
>>   }
>> 
>> @@ -211,7 +212,7 @@ public:
>>   bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain) override;
>>   bool ReadTargetOptions(const TargetOptions &TargetOpts,
>>                          bool Complain) override;
>> -  bool ReadDiagnosticOptions(const DiagnosticOptions &DiagOpts,
>> +  bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,
>>                              bool Complain) override;
>>   bool ReadFileSystemOptions(const FileSystemOptions &FSOpts,
>>                              bool Complain) override;
>> @@ -244,6 +245,8 @@ public:
>>                            bool Complain) override;
>>   bool ReadTargetOptions(const TargetOptions &TargetOpts,
>>                          bool Complain) override;
>> +  bool ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,
>> +                             bool Complain) override;
>>   bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, bool Complain,
>>                                std::string &SuggestedPredefines) override;
>>   void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;
>> 
>> Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
>> +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Mon Apr 28 19:36:53 2014
>> @@ -459,6 +459,25 @@ namespace {
>>       return false;
>>     }
>> 
>> +    virtual bool
>> +    ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,
>> +                          bool Complain) override {
>> +      Out.indent(2) << "Diagnostic options:\n";
>> +#define DIAGOPT(Name, Bits, Default) DUMP_BOOLEAN(DiagOpts->Name, #Name);
>> +#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
>> +      Out.indent(4) << #Name << ": " << DiagOpts->get##Name() << "\n";
>> +#define VALUE_DIAGOPT(Name, Bits, Default) \
>> +      Out.indent(4) << #Name << ": " << DiagOpts->Name << "\n";
>> +#include "clang/Basic/DiagnosticOptions.def"
>> +
>> +      Out.indent(4) << "Warning options:\n";
>> +      for (const std::string &Warning : DiagOpts->Warnings) {
>> +        Out.indent(6) << "-W" << Warning << "\n";
>> +      }
>> +
>> +      return false;
>> +    }
>> +
>>     bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
>>                                  bool Complain) override {
>>       Out.indent(2) << "Header search options:\n";
>> 
>> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
>> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Apr 28 19:36:53 2014
>> @@ -29,6 +29,7 @@
>> #include "clang/Basic/TargetOptions.h"
>> #include "clang/Basic/Version.h"
>> #include "clang/Basic/VersionTuple.h"
>> +#include "clang/Frontend/Utils.h"
> 
> Frontend already depends on Serialization. Serialization should not
> depend on Frontend.
> Reverted in r207497.
> 
> See also; http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/5775
> You can reproduce with BUILD_SHARED_LIBS=ON on cmake.

Thanks for the heads up.  Reapplied in r207549 with a fix to move the dependency into Basic.

> 
>> #include "clang/Lex/HeaderSearch.h"
>> #include "clang/Lex/HeaderSearchOptions.h"
>> #include "clang/Lex/MacroInfo.h"
>> @@ -90,7 +91,7 @@ ChainedASTReaderListener::ReadTargetOpti
>>          Second->ReadTargetOptions(TargetOpts, Complain);
>> }
>> bool ChainedASTReaderListener::ReadDiagnosticOptions(
>> -    const DiagnosticOptions &DiagOpts, bool Complain) {
>> +    IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
>>   return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
>>          Second->ReadDiagnosticOptions(DiagOpts, Complain);
>> }
>> @@ -291,6 +292,120 @@ namespace {
>>     DeclsMap;
>> }
>> 
>> +static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
>> +                                         DiagnosticsEngine &Diags,
>> +                                         bool Complain) {
>> +  typedef DiagnosticsEngine::Level Level;
>> +
>> +  // Check current mappings for new -Werror mappings, and the stored mappings
>> +  // for cases that were explicitly mapped to *not* be errors that are now
>> +  // errors because of options like -Werror.
>> +  DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
>> +
>> +  for (DiagnosticsEngine *MappingSource : MappingSources) {
>> +    for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
>> +      diag::kind DiagID = DiagIDMappingPair.first;
>> +      Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
>> +      if (CurLevel < DiagnosticsEngine::Error)
>> +        continue; // not significant
>> +      Level StoredLevel =
>> +          StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
>> +      if (StoredLevel < DiagnosticsEngine::Error) {
>> +        if (Complain)
>> +          Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
>> +              Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
>> +        return true;
>> +      }
>> +    }
>> +  }
>> +
>> +  return false;
>> +}
>> +
>> +static DiagnosticsEngine::ExtensionHandling
>> +isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
>> +  DiagnosticsEngine::ExtensionHandling Ext =
>> +      Diags.getExtensionHandlingBehavior();
>> +  if (Ext == DiagnosticsEngine::Ext_Warn && Diags.getWarningsAsErrors())
>> +    Ext = DiagnosticsEngine::Ext_Error;
>> +  return Ext;
>> +}
>> +
>> +static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
>> +                                    DiagnosticsEngine &Diags,
>> +                                    bool IsSystem, bool Complain) {
>> +  // Top-level options
>> +  if (IsSystem) {
>> +    if (Diags.getSuppressSystemWarnings())
>> +      return false;
>> +    // If -Wsystem-headers was not enabled before, be conservative
>> +    if (StoredDiags.getSuppressSystemWarnings()) {
>> +      if (Complain)
>> +        Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
>> +      return true;
>> +    }
>> +  }
>> +
>> +  if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
>> +    if (Complain)
>> +      Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
>> +    return true;
>> +  }
>> +
>> +  if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
>> +      !StoredDiags.getEnableAllWarnings()) {
>> +    if (Complain)
>> +      Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
>> +    return true;
>> +  }
>> +
>> +  if (isExtHandlingFromDiagsError(Diags) &&
>> +      !isExtHandlingFromDiagsError(StoredDiags)) {
>> +    if (Complain)
>> +      Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
>> +    return true;
>> +  }
>> +
>> +  return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
>> +}
>> +
>> +bool PCHValidator::ReadDiagnosticOptions(
>> +    IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
>> +  DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
>> +  IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
>> +  IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
>> +      new DiagnosticsEngine(DiagIDs, DiagOpts.getPtr()));
>> +  // This should never fail, because we would have processed these options
>> +  // before writing them to an ASTFile.
>> +  ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
>> +
>> +  ModuleManager &ModuleMgr = Reader.getModuleManager();
>> +  assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
>> +
>> +  // If the original import came from a file explicitly generated by the user,
>> +  // don't check the diagnostic mappings.
>> +  // FIXME: currently this is approximated by checking whether this is not a
>> +  // module import.
>> +  // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
>> +  // the transitive closure of its imports, since unrelated modules cannot be
>> +  // imported until after this module finishes validation.
>> +  ModuleFile *TopImport = *ModuleMgr.rbegin();
>> +  while (!TopImport->ImportedBy.empty())
>> +    TopImport = TopImport->ImportedBy[0];
>> +  if (TopImport->Kind != MK_Module)
>> +    return false;
>> +
>> +  StringRef ModuleName = TopImport->ModuleName;
>> +  assert(!ModuleName.empty() && "diagnostic options read before module name");
>> +
>> +  Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
>> +  assert(M && "missing module");
>> +
>> +  // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
>> +  // contains the union of their flags.
>> +  return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
>> +}
>> +
>> /// \brief Collect the macro definitions provided by the given preprocessor
>> /// options.
>> static void collectMacroDefinitions(const PreprocessorOptions &PPOpts,
>> @@ -2268,11 +2383,11 @@ ASTReader::ReadControlBlock(ModuleFile &
>>     }
>> 
>>     case DIAGNOSTIC_OPTIONS: {
>> -      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
>> +      bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
>>       if (Listener && &F == *ModuleMgr.begin() &&
>>           ParseDiagnosticOptions(Record, Complain, *Listener) &&
>> -          !DisableValidation && !AllowConfigurationMismatch)
>> -        return ConfigurationMismatch;
>> +          !DisableValidation)
>> +        return OutOfDate;
>>       break;
>>     }
>> 
>> @@ -4481,15 +4596,15 @@ bool ASTReader::ParseTargetOptions(const
>> 
>> bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
>>                                        ASTReaderListener &Listener) {
>> -  DiagnosticOptions DiagOpts;
>> +  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
>>   unsigned Idx = 0;
>> -#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
>> +#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
>> #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
>> -  DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
>> +  DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
>> #include "clang/Basic/DiagnosticOptions.def"
>> 
>>   for (unsigned N = Record[Idx++]; N; --N) {
>> -    DiagOpts.Warnings.push_back(ReadString(Record, Idx));
>> +    DiagOpts->Warnings.push_back(ReadString(Record, Idx));
>>   }
>> 
>>   return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
>> 
>> Added: cfe/trunk/test/Modules/Werror-Wsystem-headers.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Werror-Wsystem-headers.m?rev=207477&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/Modules/Werror-Wsystem-headers.m (added)
>> +++ cfe/trunk/test/Modules/Werror-Wsystem-headers.m Mon Apr 28 19:36:53 2014
>> @@ -0,0 +1,23 @@
>> +// REQUIRES: shell
>> +// RUN: rm -rf %t
>> +// RUN: rm -rf %t-saved
>> +// RUN: mkdir %t-saved
>> +
>> +// Initial module build
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -isysroot %S/Inputs/System -fsyntax-only %s -verify
>> +// RUN: cp %t/cstd.pcm %t-saved/cstd.pcm
>> +
>> +// Even with -Werror don't rebuild a system module
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -isysroot %S/Inputs/System -fsyntax-only %s -verify -Werror
>> +// RUN: diff %t/cstd.pcm %t-saved/cstd.pcm
>> +
>> +// Unless -Wsystem-headers is on
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -isysroot %S/Inputs/System -fsyntax-only %s -verify \
>> +// RUN:     -Werror=unused -Wsystem-headers
>> +// RUN: not diff %t/cstd.pcm %t-saved/cstd.pcm
>> +
>> +// expected-no-diagnostics
>> + at import cstd;
>> 
>> Added: cfe/trunk/test/Modules/Werror.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Werror.m?rev=207477&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/Modules/Werror.m (added)
>> +++ cfe/trunk/test/Modules/Werror.m Mon Apr 28 19:36:53 2014
>> @@ -0,0 +1,75 @@
>> +// REQUIRES: shell
>> +// RUN: rm -rf %t
>> +// RUN: rm -rf %t-saved
>> +// RUN: mkdir -p %t-saved
>> +
>> +// Initial module build (-Werror=header-guard)
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella  \
>> +// RUN:     -Werror=header-guard
>> +// RUN: cp %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// Building with looser -Werror options does not rebuild
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella
>> +// RUN: diff %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// Make the build more restricted (-Werror)
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Werror -Wno-incomplete-umbrella
>> +// RUN: not diff %t/Module.pcm %t-saved/Module.pcm
>> +// RUN: cp %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// Ensure -Werror=header-guard is less strict than -Werror
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Werror=header-guard -Wno-incomplete-umbrella
>> +// RUN: diff %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// But -Werror=unused is not, because some of its diags are DefaultIgnore
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Werror=unused
>> +// RUN: not diff %t/Module.pcm %t-saved/Module.pcm
>> +// RUN: cp %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Werror -Wno-incomplete-umbrella
>> +
>> +// FIXME: when rebuilding the module, take the union of the diagnostic options
>> +// so that we don't need to rebuild here
>> +// RUN-DISABLED: diff %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// -Wno-everything, -Werror
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Wno-everything -Wall -Werror
>> +// RUN: cp %t/Module.pcm %t-saved/Module.pcm
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Wall -Werror
>> +// RUN: not diff %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// -pedantic, -Werror is not compatible with -Wall -Werror
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -Werror -pedantic
>> +// RUN: not diff %t/Module.pcm %t-saved/Module.pcm
>> +// RUN: cp %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// -pedantic-errors is less strict that -pedantic, -Werror
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -pedantic-errors
>> +// RUN: diff %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// -Wsystem-headers does not affect non-system modules
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \
>> +// RUN:     -F %S/Inputs -fsyntax-only %s -verify -Wno-incomplete-umbrella \
>> +// RUN:     -pedantic-errors -Wsystem-headers
>> +// RUN: diff %t/Module.pcm %t-saved/Module.pcm
>> +
>> +// expected-no-diagnostics
>> + at import Module;
>> 
>> Modified: cfe/trunk/test/Modules/module_file_info.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module_file_info.m?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/Modules/module_file_info.m (original)
>> +++ cfe/trunk/test/Modules/module_file_info.m Mon Apr 28 19:36:53 2014
>> @@ -2,7 +2,7 @@
>> @import DependsOnModule;
>> 
>> // RUN: rm -rf %t
>> -// RUN: %clang_cc1 -w -fmodules -fdisable-module-hash -fmodules-cache-path=%t -F %S/Inputs -DBLARG -DWIBBLE=WOBBLE %s
>> +// RUN: %clang_cc1 -w -Wunused -fmodules -fdisable-module-hash -fmodules-cache-path=%t -F %S/Inputs -DBLARG -DWIBBLE=WOBBLE %s
>> // RUN: %clang_cc1 -module-file-info %t/DependsOnModule.pcm | FileCheck %s
>> 
>> // CHECK: Generated by this Clang:
>> @@ -21,6 +21,11 @@
>> // CHECK:     ABI:
>> // CHECK:     Linker version:
>> 
>> +// CHECK: Diagnostic options:
>> +// CHECK:   IgnoreWarnings: Yes
>> +// CHECK:   Warning options:
>> +// CHECK:     -Wunused
>> +
>> // CHECK: Header search options:
>> // CHECK:   System root [-isysroot=]: '/'
>> // CHECK:   Use builtin include directories [-nobuiltininc]: Yes
>> 
>> Modified: cfe/trunk/test/Modules/resolution-change.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/resolution-change.m?rev=207477&r1=207476&r2=207477&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/Modules/resolution-change.m (original)
>> +++ cfe/trunk/test/Modules/resolution-change.m Mon Apr 28 19:36:53 2014
>> @@ -6,6 +6,9 @@
>> // Use the PCH with the same header search options; should be fine
>> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I %S/Inputs/modules-with-same-name/DependsOnA -I %S/Inputs/modules-with-same-name/path1/A -include-pch %t-A.pch %s -fsyntax-only -Werror
>> 
>> +// Different -W options are ok
>> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I %S/Inputs/modules-with-same-name/DependsOnA -I %S/Inputs/modules-with-same-name/path1/A -include-pch %t-A.pch %s -fsyntax-only -Werror -Wauto-import
>> +
>> // Use the PCH with no way to resolve DependsOnA
>> // RUN: not %clang_cc1 -fmodules -fmodules-cache-path=%t -include-pch %t-A.pch %s -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-NODOA %s
>> // CHECK-NODOA: module 'DependsOnA' imported by AST file '{{.*A.pch}}' not found
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list