diff options
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 2603a3f..07d6814 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -26,6 +26,7 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/OptionUtils.h" #include "clang/Driver/Options.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Frontend/Debug/Options.h" @@ -44,6 +45,7 @@ #include <cstdlib> #include <memory> #include <optional> +#include <sstream> using namespace Fortran::frontend; @@ -1140,11 +1142,43 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, res.getLangOpts().OpenMPVersion = 31; res.getFrontendOpts().features.Enable( Fortran::common::LanguageFeature::OpenMP); - if (int Version = getLastArgIntValue( - args, clang::driver::options::OPT_fopenmp_version_EQ, - res.getLangOpts().OpenMPVersion, diags)) { - res.getLangOpts().OpenMPVersion = Version; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_fopenmp_version_EQ)) { + llvm::ArrayRef<unsigned> ompVersions = llvm::omp::getOpenMPVersions(); + unsigned oldVersions[] = {11, 20, 25, 30}; + unsigned version = 0; + + auto reportBadVersion = [&](llvm::StringRef value) { + const unsigned diagID = + diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "'%0' is not a valid OpenMP version in '%1', " + "valid versions are %2"); + std::string buffer; + llvm::raw_string_ostream versions(buffer); + llvm::interleaveComma(ompVersions, versions); + + diags.Report(diagID) << value << arg->getAsString(args) << versions.str(); + }; + + llvm::StringRef value = arg->getValue(); + if (!value.getAsInteger(/*radix=*/10, version)) { + if (llvm::is_contained(ompVersions, version)) { + res.getLangOpts().OpenMPVersion = version; + } else if (llvm::is_contained(oldVersions, version)) { + const unsigned diagID = + diags.getCustomDiagID(clang::DiagnosticsEngine::Warning, + "OpenMP version %0 is no longer supported, " + "assuming version %1"); + std::string assumed = std::to_string(res.getLangOpts().OpenMPVersion); + diags.Report(diagID) << value << assumed; + } else { + reportBadVersion(value); + } + } else { + reportBadVersion(value); + } } + if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) { res.getLangOpts().OpenMPForceUSM = 1; } |