From: Richard Smith Date: Thu, 24 May 2018 20:03:51 +0000 (+0000) Subject: Improve diagnostics for config mismatches with -fmodule-file. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13c1a496d7a9266040b50fcc5aaee0e73e9300dc;p=clang Improve diagnostics for config mismatches with -fmodule-file. 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 --- diff --git a/include/clang/Basic/DiagnosticSerializationKinds.td b/include/clang/Basic/DiagnosticSerializationKinds.td index 03aaaefff2..ae5c00c74f 100644 --- a/include/clang/Basic/DiagnosticSerializationKinds.td +++ b/include/clang/Basic/DiagnosticSerializationKinds.td @@ -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">; diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 859560d938..d9900867d8 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -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(*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. diff --git a/test/Modules/check-for-sanitizer-feature.cpp b/test/Modules/check-for-sanitizer-feature.cpp index 40ae46c646..c015669071 100644 --- a/test/Modules/check-for-sanitizer-feature.cpp +++ b/test/Modules/check-for-sanitizer-feature.cpp @@ -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 diff --git a/test/Modules/merge-target-features.cpp b/test/Modules/merge-target-features.cpp index 9ca0539e6a..6a29c2db8a 100644 --- a/test/Modules/merge-target-features.cpp +++ b/test/Modules/merge-target-features.cpp @@ -19,10 +19,9 @@ // 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 \ @@ -57,10 +56,10 @@ // 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"