summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDavid Sheinkman <davidsheinkman@outlook.com>2016-10-04 14:41:36 +0000
committerDavid Sheinkman <davidsheinkman@outlook.com>2016-10-04 14:41:36 +0000
commit92589990bae53c00179b772fd500ef6679455c90 (patch)
tree6686606e5484a3239a8ead36deed664616a4e48e /clang
parentaf63ab2b6935b7468dbaad242b3bee84ed3e1cbc (diff)
downloadbcm5719-llvm-92589990bae53c00179b772fd500ef6679455c90.tar.gz
bcm5719-llvm-92589990bae53c00179b772fd500ef6679455c90.zip
[OpenMP] fix segfault when a variable referenced in reduction clause is a reference parameter\nDifferential Revision: http://reviews.llvm.org/D24524
llvm-svn: 283223
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp2
-rw-r--r--clang/test/OpenMP/distribute_parallel_for_reduction_messages.cpp8
-rw-r--r--clang/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp8
-rw-r--r--clang/test/OpenMP/distribute_simd_reduction_messages.cpp8
-rw-r--r--clang/test/OpenMP/for_reduction_messages.cpp7
-rw-r--r--clang/test/OpenMP/for_simd_reduction_messages.cpp7
-rw-r--r--clang/test/OpenMP/parallel_for_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/parallel_for_simd_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/parallel_reduction_messages.cpp5
-rw-r--r--clang/test/OpenMP/parallel_sections_reduction_messages.cpp7
-rw-r--r--clang/test/OpenMP/sections_reduction_messages.cpp8
-rw-r--r--clang/test/OpenMP/simd_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/target_parallel_for_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/target_parallel_reduction_messages.cpp5
-rw-r--r--clang/test/OpenMP/target_simd_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/teams_distribute_reduction_messages.cpp6
-rw-r--r--clang/test/OpenMP/teams_reduction_messages.cpp6
18 files changed, 112 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 5cbcea4cce3..7dcd81f69d8 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -9401,7 +9401,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;
diff --git a/clang/test/OpenMP/distribute_parallel_for_reduction_messages.cpp b/clang/test/OpenMP/distribute_parallel_for_reduction_messages.cpp
index f23a25e28c0..95654a9e501 100644
--- a/clang/test/OpenMP/distribute_parallel_for_reduction_messages.cpp
+++ b/clang/test/OpenMP/distribute_parallel_for_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp b/clang/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp
index 7b7e9ea53cc..6ad41d72bf7 100644
--- a/clang/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/distribute_simd_reduction_messages.cpp b/clang/test/OpenMP/distribute_simd_reduction_messages.cpp
index e03b8529280..fca3e85a710 100644
--- a/clang/test/OpenMP/distribute_simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/distribute_simd_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/for_reduction_messages.cpp b/clang/test/OpenMP/for_reduction_messages.cpp
index 45a4681440f..bb70ecc2b23 100644
--- a/clang/test/OpenMP/for_reduction_messages.cpp
+++ b/clang/test/OpenMP/for_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/for_simd_reduction_messages.cpp b/clang/test/OpenMP/for_simd_reduction_messages.cpp
index 2935cec602d..485070e758a 100644
--- a/clang/test/OpenMP/for_simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/for_simd_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/parallel_for_reduction_messages.cpp b/clang/test/OpenMP/parallel_for_reduction_messages.cpp
index 4d5a143bae3..57ab1fac9c1 100644
--- a/clang/test/OpenMP/parallel_for_reduction_messages.cpp
+++ b/clang/test/OpenMP/parallel_for_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/parallel_for_simd_reduction_messages.cpp b/clang/test/OpenMP/parallel_for_simd_reduction_messages.cpp
index afb0b367c41..60a947dd5f8 100644
--- a/clang/test/OpenMP/parallel_for_simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/parallel_for_simd_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/parallel_reduction_messages.cpp b/clang/test/OpenMP/parallel_reduction_messages.cpp
index af1f5ed7bc0..947353fc2dd 100644
--- a/clang/test/OpenMP/parallel_reduction_messages.cpp
+++ b/clang/test/OpenMP/parallel_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/parallel_sections_reduction_messages.cpp b/clang/test/OpenMP/parallel_sections_reduction_messages.cpp
index 52d4cb9cdcb..05cc7f0f6c5 100644
--- a/clang/test/OpenMP/parallel_sections_reduction_messages.cpp
+++ b/clang/test/OpenMP/parallel_sections_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/sections_reduction_messages.cpp b/clang/test/OpenMP/sections_reduction_messages.cpp
index 134bf619c91..f13c5b3f286 100644
--- a/clang/test/OpenMP/sections_reduction_messages.cpp
+++ b/clang/test/OpenMP/sections_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/simd_reduction_messages.cpp b/clang/test/OpenMP/simd_reduction_messages.cpp
index c47d53eb918..1e1a233ec49 100644
--- a/clang/test/OpenMP/simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/simd_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/target_parallel_for_reduction_messages.cpp b/clang/test/OpenMP/target_parallel_for_reduction_messages.cpp
index 16697a98733..234b71aec21 100644
--- a/clang/test/OpenMP/target_parallel_for_reduction_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_for_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp b/clang/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp
index 3999d381628..289b5b2641b 100644
--- a/clang/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_for_simd_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/target_parallel_reduction_messages.cpp b/clang/test/OpenMP/target_parallel_reduction_messages.cpp
index c9434e76245..52338ee71cb 100644
--- a/clang/test/OpenMP/target_parallel_reduction_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_reduction_messages.cpp
@@ -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 {
diff --git a/clang/test/OpenMP/target_simd_reduction_messages.cpp b/clang/test/OpenMP/target_simd_reduction_messages.cpp
index 61c7ddeae7d..ca14acb2293 100644
--- a/clang/test/OpenMP/target_simd_reduction_messages.cpp
+++ b/clang/test/OpenMP/target_simd_reduction_messages.cpp
@@ -9,6 +9,12 @@ bool foobool(int argc) {
return argc;
}
+void foobar(int &ref) {
+#pragma omp target 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 {
diff --git a/clang/test/OpenMP/teams_distribute_reduction_messages.cpp b/clang/test/OpenMP/teams_distribute_reduction_messages.cpp
index 63023c28449..d0a6d296c0f 100644
--- a/clang/test/OpenMP/teams_distribute_reduction_messages.cpp
+++ b/clang/test/OpenMP/teams_distribute_reduction_messages.cpp
@@ -9,6 +9,12 @@ bool foobool(int argc) {
return argc;
}
+void foobar(int &ref) {
+#pragma omp target
+#pragma omp teams distribute reduction(+:ref)
+ for (int j=0; j<100; j++) foo();
+}
+
struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
extern S1 a;
class S2 {
diff --git a/clang/test/OpenMP/teams_reduction_messages.cpp b/clang/test/OpenMP/teams_reduction_messages.cpp
index 0420b010bb6..9974c147b72 100644
--- a/clang/test/OpenMP/teams_reduction_messages.cpp
+++ b/clang/test/OpenMP/teams_reduction_messages.cpp
@@ -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 {
OpenPOWER on IntegriCloud