[clang] 3ef1134 - Fix DeferredDiagnosticsEmitter for bug#45987
Yaxun Liu via cfe-commits
cfe-commits at lists.llvm.org
Thu May 21 08:08:47 PDT 2020
Author: Yaxun (Sam) Liu
Date: 2020-05-21T11:01:40-04:00
New Revision: 3ef11346f391e6e3da0cfa25f9f7dac22771438e
URL: https://github.com/llvm/llvm-project/commit/3ef11346f391e6e3da0cfa25f9f7dac22771438e
DIFF: https://github.com/llvm/llvm-project/commit/3ef11346f391e6e3da0cfa25f9f7dac22771438e.diff
LOG: Fix DeferredDiagnosticsEmitter for bug#45987
InOMPDeviceContext may be greater than 1. It needs to be clamp to 0 and 1
to be used as index for DoneMap.
Added:
clang/test/OpenMP/deferred-diags.cpp
Modified:
clang/lib/Sema/Sema.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 0d2877efe3ee..b3aeb1018467 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -1539,7 +1539,7 @@ class DeferredDiagnosticsEmitter
}
void checkFunc(SourceLocation Loc, FunctionDecl *FD) {
- auto &Done = DoneMap[InOMPDeviceContext];
+ auto &Done = DoneMap[InOMPDeviceContext > 0 ? 1 : 0];
FunctionDecl *Caller = UsePath.empty() ? nullptr : UsePath.back();
if ((!ShouldEmitRootNode && !S.getLangOpts().OpenMP && !Caller) ||
S.shouldIgnoreInHostDeviceCheck(FD) || InUsePath.count(FD))
diff --git a/clang/test/OpenMP/deferred-diags.cpp b/clang/test/OpenMP/deferred-diags.cpp
new file mode 100644
index 000000000000..98c28aff644a
--- /dev/null
+++ b/clang/test/OpenMP/deferred-diags.cpp
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -triple x86_64 -verify=expected,dev -std=c++11\
+// RUN: -verify-ignore-unexpected=note \
+// RUN: -fopenmp -fopenmp-version=50 -o - %s
+
+// expected-no-diagnostics
+
+// Test no infinite recursion in DeferredDiagnosticEmitter.
+constexpr int foo(int *x) {
+ return 0;
+}
+
+int a = foo(&a);
+
+// Test no crash when both caller and callee have target directives.
+int foo();
+
+class B {
+public:
+ void barB(int *isHost) {
+ #pragma omp target map(tofrom: isHost)
+ {
+ *isHost = foo();
+ }
+ }
+};
+
+class A : public B {
+public:
+ void barA(int *isHost) {
+ #pragma omp target map(tofrom: isHost)
+ {
+ barB(isHost);
+ }
+ }
+};
More information about the cfe-commits
mailing list