|
26 | 26 | #include "clang/Driver/Driver.h"
|
27 | 27 | #include "clang/Driver/OptionUtils.h"
|
28 | 28 | #include "clang/Driver/Options.h"
|
| 29 | +#include "llvm/ADT/ArrayRef.h" |
29 | 30 | #include "llvm/ADT/StringRef.h"
|
30 | 31 | #include "llvm/ADT/StringSwitch.h"
|
31 | 32 | #include "llvm/Frontend/Debug/Options.h"
|
|
44 | 45 | #include <cstdlib>
|
45 | 46 | #include <memory>
|
46 | 47 | #include <optional>
|
| 48 | +#include <sstream> |
47 | 49 |
|
48 | 50 | using namespace Fortran::frontend;
|
49 | 51 |
|
@@ -1140,11 +1142,43 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
|
1140 | 1142 | res.getLangOpts().OpenMPVersion = 31;
|
1141 | 1143 | res.getFrontendOpts().features.Enable(
|
1142 | 1144 | Fortran::common::LanguageFeature::OpenMP);
|
1143 |
| - if (int Version = getLastArgIntValue( |
1144 |
| - args, clang::driver::options::OPT_fopenmp_version_EQ, |
1145 |
| - res.getLangOpts().OpenMPVersion, diags)) { |
1146 |
| - res.getLangOpts().OpenMPVersion = Version; |
| 1145 | + if (auto *arg = |
| 1146 | + args.getLastArg(clang::driver::options::OPT_fopenmp_version_EQ)) { |
| 1147 | + llvm::ArrayRef<unsigned> ompVersions = llvm::omp::getOpenMPVersions(); |
| 1148 | + unsigned oldVersions[] = {11, 20, 25, 30}; |
| 1149 | + unsigned version = 0; |
| 1150 | + |
| 1151 | + auto reportBadVersion = [&](llvm::StringRef value) { |
| 1152 | + const unsigned diagID = |
| 1153 | + diags.getCustomDiagID(clang::DiagnosticsEngine::Error, |
| 1154 | + "'%0' is not a valid OpenMP version in '%1', " |
| 1155 | + "valid versions are %2"); |
| 1156 | + std::string buffer; |
| 1157 | + llvm::raw_string_ostream versions(buffer); |
| 1158 | + llvm::interleaveComma(ompVersions, versions); |
| 1159 | + |
| 1160 | + diags.Report(diagID) << value << arg->getAsString(args) << versions.str(); |
| 1161 | + }; |
| 1162 | + |
| 1163 | + llvm::StringRef value = arg->getValue(); |
| 1164 | + if (!value.getAsInteger(/*radix=*/10, version)) { |
| 1165 | + if (llvm::is_contained(ompVersions, version)) { |
| 1166 | + res.getLangOpts().OpenMPVersion = version; |
| 1167 | + } else if (llvm::is_contained(oldVersions, version)) { |
| 1168 | + const unsigned diagID = |
| 1169 | + diags.getCustomDiagID(clang::DiagnosticsEngine::Warning, |
| 1170 | + "OpenMP version %0 is no longer supported, " |
| 1171 | + "assuming version %1"); |
| 1172 | + std::string assumed = std::to_string(res.getLangOpts().OpenMPVersion); |
| 1173 | + diags.Report(diagID) << value << assumed; |
| 1174 | + } else { |
| 1175 | + reportBadVersion(value); |
| 1176 | + } |
| 1177 | + } else { |
| 1178 | + reportBadVersion(value); |
| 1179 | + } |
1147 | 1180 | }
|
| 1181 | + |
1148 | 1182 | if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) {
|
1149 | 1183 | res.getLangOpts().OpenMPForceUSM = 1;
|
1150 | 1184 | }
|
|
0 commit comments