================
@@ -2719,14 +2721,43 @@ Preprocessor::ImportAction 
Preprocessor::HandleHeaderIncludeOrImport(
         Path = (Path.substr(0, 1) + "\\\\?\\" + Path.substr(1)).str();
 #endif
 
+      SuggestedPath = std::make_optional(std::move(Path));
+      HasCaseDifference = true;
+    }
+
+    bool HasReplaceableBackslash = false;
+    if (Name.contains('\\')) {
+      if (!SuggestedPath.has_value()) {
+        SuggestedPath = std::make_optional(OriginalFilename);
+      }
+      std::replace(SuggestedPath->begin(), SuggestedPath->end(), '\\', '/');
+      HasReplaceableBackslash = true;
+    }
+
+    SourceLocation FilenameLoc = FilenameTok.getLocation();
+    bool SuppressDiag = FilenameLoc.isMacroID() ||
+                        SourceMgr.isWrittenInBuiltinFile(FilenameLoc) ||
+                        SourceMgr.isWrittenInModuleIncludes(FilenameLoc) ||
+                        SourceMgr.isWrittenInExtractAPIIncludes(FilenameLoc);
+    if (SuggestedPath.has_value() && !SuppressDiag) {
       // For user files and known standard headers, issue a diagnostic.
       // For other system headers, don't. They can be controlled separately.
       auto DiagId =
           (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name))
               ? diag::pp_nonportable_path
               : diag::pp_nonportable_system_path;
-      Diag(FilenameTok, DiagId) << Path <<
-        FixItHint::CreateReplacement(FilenameRange, Path);
+      auto Diagnostic =
+          Diag(FilenameTok, DiagId)
+          << SuggestedPath.value()
+          << FixItHint::CreateReplacement(FilenameRange, 
SuggestedPath.value());
+      if (HasCaseDifference && HasReplaceableBackslash) {
+        Diagnostic << "specified path contains backslashes and differs in case 
"
+                      "from file name on disk";
+      } else if (HasReplaceableBackslash) {
+        Diagnostic << "specified path contains backslashes";
+      } else if (HasCaseDifference) {
+        Diagnostic << "specified path differs in case from file name on disk";
+      }
----------------
AaronBallman wrote:

Please specify this via a `%select` in the .td file instead of hard-coding 
strings here (we prefer diagnostic text to live in the .td file for 
localization purposes).

https://github.com/llvm/llvm-project/pull/186770
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to