diff --git a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index d16aff84f445f..bc09dec17b7ae 100644 --- a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -101,6 +101,18 @@ createFrontendAction(CompilerInstance &ci) { llvm_unreachable("Invalid program action!"); } +static void emitUnknownDiagWarning(clang::DiagnosticsEngine &diags, + clang::diag::Flavor flavor, + llvm::StringRef prefix, + llvm::StringRef opt) { + llvm::StringRef suggestion = + clang::DiagnosticIDs::getNearestOption(flavor, opt); + diags.Report(clang::diag::warn_unknown_diag_option) + << (flavor == clang::diag::Flavor::WarningOrError ? 0 : 1) + << (prefix.str() += std::string(opt)) << !suggestion.empty() + << (prefix.str() += std::string(suggestion)); +} + // Remarks are ignored by default in Diagnostic.td, hence, we have to // enable them here before execution. Clang follows same idea using // ProcessWarningOptions in Warnings.cpp @@ -123,6 +135,13 @@ updateDiagEngineForOptRemarks(clang::DiagnosticsEngine &diagsEng, if (!isPositive) remarkOpt = remarkOpt.substr(3); + // Verify that this is a valid optimization remarks option + if (diagIDs->getDiagnosticsInGroup(flavor, remarkOpt, diags)) { + emitUnknownDiagWarning(diagsEng, flavor, isPositive ? "-R" : "-Rno-", + remarkOpt); + return; + } + diagsEng.setSeverityForGroup(flavor, remarkOpt, isPositive ? clang::diag::Severity::Remark : clang::diag::Severity::Ignored); diff --git a/flang/test/Driver/optimization-remark-invalid.f90 b/flang/test/Driver/optimization-remark-invalid.f90 index 829ccba895199..a57be4ec3e729 100644 --- a/flang/test/Driver/optimization-remark-invalid.f90 +++ b/flang/test/Driver/optimization-remark-invalid.f90 @@ -5,8 +5,15 @@ ! Check error on invalid regex -Rpass message is emitted ! RUN: not %flang %s -O1 -Rpass=[ -c 2>&1 | FileCheck %s --check-prefix=REGEX-INVALID +! Check "unknown remark option" warning +! RUN: %flang %s -O1 -R -c 2>&1 | FileCheck %s --check-prefix=WARN + +! Check "unknown remark option" warning with suggestion +! RUN: %flang %s -O1 -Rpas -c 2>&1 | FileCheck %s --check-prefix=WARN-SUGGEST ! REGEX-INVALID: error: in pattern '-Rpass=[': brackets ([ ]) not balanced +! WARN: warning: unknown remark option '-R' +! WARN-SUGGEST: warning: unknown remark option '-Rpas'; did you mean '-Rpass'? program forttest end program forttest