]> granicus.if.org Git - clang/commitdiff
Improve diagnostics for config mismatches with -fmodule-file.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 24 May 2018 20:03:51 +0000 (20:03 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 24 May 2018 20:03:51 +0000 (20:03 +0000)
Unless the user uses -Wno-module-file-config-mismatch (or -Wno-error=...),
allow the AST reader to produce errors describing the nature of the config
mismatch.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333220 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSerializationKinds.td
lib/Frontend/CompilerInstance.cpp
test/Modules/check-for-sanitizer-feature.cpp
test/Modules/merge-target-features.cpp

index 03aaaefff2de215613ddd5f147a4cf6968ffae00..ae5c00c74fb2a0dfd4a445ea7e6160f345495efd 100644 (file)
@@ -38,8 +38,8 @@ def err_pch_targetopt_mismatch : Error<
     "PCH file was compiled for the %0 '%1' but the current translation "
     "unit is being compiled for target '%2'">;
 def err_pch_targetopt_feature_mismatch : Error<
-    "%select{AST file|current translation unit}0 was compiled with the target "
-    "feature'%1' but the %select{current translation unit is|AST file was}0 "
+    "%select{AST file was|current translation unit is}0 compiled with the target "
+    "feature '%1' but the %select{current translation unit is|AST file was}0 "
     "not">;
 def err_pch_langopt_mismatch : Error<"%0 was %select{disabled|enabled}1 in "
     "PCH file but is currently %select{disabled|enabled}2">;
index 859560d938f575d556958cfd8a345607fad0845d..d9900867d88f85e72e414301e43150333ae50851 100644 (file)
@@ -1602,15 +1602,22 @@ bool CompilerInstance::loadModuleFile(StringRef FileName) {
   if (!ModuleManager)
     createModuleManager();
 
+  // If -Wmodule-file-config-mismatch is mapped as an error or worse, allow the
+  // ASTReader to diagnose it, since it can produce better errors that we can.
+  bool ConfigMismatchIsRecoverable =
+      getDiagnostics().getDiagnosticLevel(diag::warn_module_config_mismatch,
+                                          SourceLocation())
+        <= DiagnosticsEngine::Warning;
+
   auto Listener = llvm::make_unique<ReadModuleNames>(*this);
   auto &ListenerRef = *Listener;
   ASTReader::ListenerScope ReadModuleNamesListener(*ModuleManager,
                                                    std::move(Listener));
 
   // Try to load the module file.
-  switch (ModuleManager->ReadAST(FileName, serialization::MK_ExplicitModule,
-                                 SourceLocation(),
-                                 ASTReader::ARR_ConfigurationMismatch)) {
+  switch (ModuleManager->ReadAST(
+      FileName, serialization::MK_ExplicitModule, SourceLocation(),
+      ConfigMismatchIsRecoverable ? ASTReader::ARR_ConfigurationMismatch : 0)) {
   case ASTReader::Success:
     // We successfully loaded the module file; remember the set of provided
     // modules so that we don't try to load implicit modules for them.
index 40ae46c6468479424e388ce798762e7ee5ef1853..c015669071b7a5deb04ebad8729122a514d7199b 100644 (file)
@@ -43,7 +43,7 @@
 //
 // Import the PCH without ASan enabled (we expect an error).
 // RUN: not %clang_cc1 -x c -include-pch %t.asan_pch %s -verify 2>&1 | FileCheck %s --check-prefix=PCH_MISMATCH
-// PCH_MISMATCH: AST file was compiled with the target feature'-fsanitize=address' but the current translation unit is not
+// PCH_MISMATCH: AST file was compiled with the target feature '-fsanitize=address' but the current translation unit is not
 //
 // Emit a PCH with UBSan enabled.
 // RUN: %clang_cc1 -x c -fsanitize=null %S/Inputs/check-for-sanitizer-feature/check.h -emit-pch -o %t.ubsan_pch
index 9ca0539e6a22ed15414da9d9a9d8abcc33917fd6..6a29c2db8a8d9e48636fac56e9fae0f574b5f10e 100644 (file)
 // RUN:   -triple i386-unknown-unknown \
 // RUN:   -target-cpu i386 \
 // RUN:   -fsyntax-only merge-target-features.cpp 2>&1 \
-// RUN:   | FileCheck --check-prefix=SUBSET %s
-// SUBSET-NOT: error:
+// RUN:   | FileCheck --check-prefix=SUBSET --implicit-check-not=error: %s
+// SUBSET: error: AST file was compiled with the target feature '+sse2' but the current translation unit is not
 // SUBSET: error: {{.*}} configuration mismatch
-// SUBSET-NOT: error:
 //
 // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
 // RUN:   -iquote Inputs/merge-target-features \
 // RUN:   -triple i386-unknown-unknown \
 // RUN:   -target-cpu i386 -target-feature +cx16 \
 // RUN:   -fsyntax-only merge-target-features.cpp 2>&1 \
-// RUN:   | FileCheck --check-prefix=MISMATCH %s
-// MISMATCH-NOT: error:
+// RUN:   | FileCheck --check-prefix=MISMATCH --implicit-check-not=error: %s
+// MISMATCH: error: AST file was compiled with the target feature '+sse2' but the current translation unit is not
+// MISMATCH: error: current translation unit is compiled with the target feature '+cx16' but the AST file was not
 // MISMATCH: error: {{.*}} configuration mismatch
-// MISMATCH-NOT: error:
 
 #include "foo.h"