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
// 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;
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {