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

llvm-svn: 283223
This commit is contained in:
David Sheinkman 2016-10-04 14:41:36 +00:00
parent af63ab2b69
commit 92589990ba
18 changed files with 112 additions and 1 deletions

View File

@ -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;

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View 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 {

View File

@ -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 {

View File

@ -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 {

View 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 {