]> granicus.if.org Git - clang/commitdiff
Merging r283223:
authorAlexey Bataev <a.bataev@hotmail.com>
Tue, 15 Nov 2016 14:44:21 +0000 (14:44 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Tue, 15 Nov 2016 14:44:21 +0000 (14:44 +0000)
r283223 | davidsh | 2016-10-04 10:41:36 -0400 (Tue, 04 Oct 2016) | 1 line

[OpenMP] fix segfault when a variable referenced in reduction clause is a reference parameter
Differential Revision: http://reviews.llvm.org/D24524

git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_39@286972 91177308-0d34-0410-b5e6-96231b3b80d8

16 files changed:
lib/Sema/SemaOpenMP.cpp
test/OpenMP/distribute_parallel_for_reduction_messages.cpp
test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp
test/OpenMP/distribute_simd_reduction_messages.cpp
test/OpenMP/for_reduction_messages.cpp
test/OpenMP/for_simd_reduction_messages.cpp
test/OpenMP/parallel_for_reduction_messages.cpp
test/OpenMP/parallel_for_simd_reduction_messages.cpp
test/OpenMP/parallel_reduction_messages.cpp
test/OpenMP/parallel_sections_reduction_messages.cpp
test/OpenMP/sections_reduction_messages.cpp
test/OpenMP/simd_reduction_messages.cpp
test/OpenMP/target_parallel_for_reduction_messages.cpp
test/OpenMP/target_parallel_for_simd_reduction_messages.cpp
test/OpenMP/target_parallel_reduction_messages.cpp
test/OpenMP/teams_reduction_messages.cpp

index 3c8554893b431e87c911909fbfc2f3be0a0c9aaa..45085f1dc4968422e04da278594248f818413003 100644 (file)
@@ -9133,7 +9133,7 @@ OMPClause *Sema::ActOnOpenMPReductionClause(
     //  for all threads of the team.
     if (!ASE && !OASE && VD) {
       VarDecl *VDDef = VD->getDefinition();
-      if (VD->getType()->isReferenceType() && VDDef) {
+      if (VD->getType()->isReferenceType() && VDDef && VDDef->hasInit()) {
         DSARefChecker Check(DSAStack);
         if (Check.Visit(VDDef->getInit())) {
           Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange;
index f23a25e28c0293fbd5d37abc1150aad8e0ca0117..95654a9e5018290b03e43981a4f42497d7c44630 100644 (file)
@@ -9,6 +9,14 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target
+#pragma omp teams
+#pragma omp distribute parallel for reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 7b7e9ea53ccb437881d106e04a441c019474bb22..6ad41d72bf78bacfa3a233b68a87c73a8b9c1bbd 100644 (file)
@@ -9,6 +9,14 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target
+#pragma omp teams
+#pragma omp distribute parallel for simd reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index e03b852928082c88ee257f827aa749406ec1327b..fca3e85a7104d9a5cdb3f60f3b780d1a80fc6d11 100644 (file)
@@ -9,6 +9,14 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target
+#pragma omp teams
+#pragma omp distribute simd reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 45a4681440fc2d2f2d7b775ed241046b2460ead7..bb70ecc2b23e83f0a9835abe8cbd9951f8fa5a41 100644 (file)
@@ -9,6 +9,13 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel
+#pragma omp for reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 2935cec602dd23a81ffe86dc449d1f354dc98cc5..485070e758ae33a57797fe9560f7c1b4d7148def 100644 (file)
@@ -9,6 +9,13 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel
+#pragma omp for simd reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 4d5a143bae3a3735a9005a86e80ab9aed63637a5..57ab1fac9c11fa3ad0e005f93cfafedf1cd4447b 100644 (file)
@@ -9,6 +9,12 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel for reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index afb0b367c419352626d604a7f23dfe7ffebff69f..60a947dd5f8442582153a88c2aea8695c829560c 100644 (file)
@@ -9,6 +9,12 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel for simd reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index af1f5ed7bc0d9e709b4f1d2340baff636f7281d6..947353fc2dd4a7305ce96235cb73a64a167f3146 100644 (file)
@@ -9,6 +9,11 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel reduction(+:ref)
+  foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 52d4cb9cdcb653b6cbdccf4839c34e19d283ce85..05cc7f0f6c5faf702ac2231152790e4bf7b86be8 100644 (file)
@@ -9,6 +9,13 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel sections reduction(+:ref)
+  {
+    foo();
+  }
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 134bf619c911392be8f1395e0670233744bdddc9..f13c5b3f2862292c01f43fcd1bbcff20ab89d39b 100644 (file)
@@ -9,6 +9,14 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp parallel   
+#pragma omp sections reduction(+:ref)
+  {
+    foo();
+  }
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index c47d53eb9185e96ce42c3049afd8eb71fd26ca40..1e1a233ec49971a2e4ac3f38072896c46bc26ef3 100644 (file)
@@ -9,6 +9,12 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp simd reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 16697a98733b4856d56e0662444d075977ad789f..234b71aec218b68032b6fcd01503850f0049e9a1 100644 (file)
@@ -9,6 +9,12 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target parallel for reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 3999d38162843fda98535f608f23f3f941a4eab8..289b5b2641b6200e9c3441f128189b05c7995b12 100644 (file)
@@ -9,6 +9,12 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target parallel for simd reduction(+:ref)
+  for (int i = 0; i < 10; ++i)
+    foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index c9434e76245b9ba7aee2aadba6aee9a62bf6bb50..52338ee71cbe3d2e5a0c17e976e670afc45f7456 100644 (file)
@@ -9,6 +9,11 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target parallel reduction(+:ref)
+  foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {
index 0420b010bb65b85a755a46e62e382f5483097f05..9974c147b72c2ca32d580345cae95c30c3f0adbc 100644 (file)
@@ -9,6 +9,12 @@ bool foobool(int argc) {
   return argc;
 }
 
+void foobar(int &ref) {
+#pragma omp target
+#pragma omp teams reduction(+:ref)
+  foo();
+}
+
 struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
 extern S1 a;
 class S2 {