Skip to content

Commit e598272

Browse files
kparzyszAnthony Tran
authored andcommitted
[flang][OpenMP] Verify that N in -fopenmp-version=N is valid (llvm#145725)
For historical versions that are unsupported, emit a warning and assume the currently default version. For values of N that are not integers or that don't correspond to any OpenMP version (old or newer), emit an error.
1 parent d363210 commit e598272

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "clang/Driver/Driver.h"
2727
#include "clang/Driver/OptionUtils.h"
2828
#include "clang/Driver/Options.h"
29+
#include "llvm/ADT/ArrayRef.h"
2930
#include "llvm/ADT/StringRef.h"
3031
#include "llvm/ADT/StringSwitch.h"
3132
#include "llvm/Frontend/Debug/Options.h"
@@ -44,6 +45,7 @@
4445
#include <cstdlib>
4546
#include <memory>
4647
#include <optional>
48+
#include <sstream>
4749

4850
using namespace Fortran::frontend;
4951

@@ -1140,11 +1142,43 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
11401142
res.getLangOpts().OpenMPVersion = 31;
11411143
res.getFrontendOpts().features.Enable(
11421144
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+
}
11471180
}
1181+
11481182
if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) {
11491183
res.getLangOpts().OpenMPForceUSM = 1;
11501184
}

flang/test/Driver/fopenmp-version.F90

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=31 %s | FileCheck --check-prefix=V31 %s
2+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=40 %s | FileCheck --check-prefix=V40 %s
3+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=45 %s | FileCheck --check-prefix=V45 %s
4+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=50 %s | FileCheck --check-prefix=V50 %s
5+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=51 %s | FileCheck --check-prefix=V51 %s
6+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=52 %s | FileCheck --check-prefix=V52 %s
7+
!RUN: %flang -dM -E -o - -fopenmp -fopenmp-version=60 %s | FileCheck --check-prefix=V60 %s
8+
9+
!V31: #define _OPENMP 201107
10+
!V40: #define _OPENMP 201307
11+
!V45: #define _OPENMP 201511
12+
!V50: #define _OPENMP 201811
13+
!V51: #define _OPENMP 202011
14+
!V52: #define _OPENMP 202111
15+
!V60: #define _OPENMP 202411
16+
17+
18+
!RUN: %flang -c -fopenmp -fopenmp-version=25 %s 2>&1 | FileCheck --check-prefix=WARN-ASSUMED %s
19+
20+
!WARN-ASSUMED: warning: OpenMP version 25 is no longer supported, assuming version 31
21+
22+
23+
!RUN: not %flang -c -fopenmp -fopenmp-version=29 %s 2>&1 | FileCheck --check-prefix=ERR-BAD %s
24+
25+
!ERR-BAD: error: '29' is not a valid OpenMP version in '-fopenmp-version=29', valid versions are 31, 40, 45, 50, 51, 52, 60

0 commit comments

Comments
 (0)