[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:
parent
af63ab2b69
commit
92589990ba
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue